All GTP traffic is currently sent from the same source port.  This makes
everything look like one big flow which is difficult to balance across
network resources.

>From 3GPP TS 29.281:
"...the UDP Source Port or the Flow Label field... should be set dynamically
by the sending GTP-U entity to help balancing the load in the transport
network."

Signed-off-by: Jonas Bonn <jo...@norrbonn.se>
---
 drivers/net/gtp.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index 4a3a52970856..236ebbcb37bf 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -477,7 +477,7 @@ static int gtp_xmit_ip4(struct sk_buff *skb, struct 
net_device *dev)
        __be32 saddr;
        struct iphdr *iph;
        int headroom;
-       __be16 port;
+       __be16 sport, port;
        int r;
 
        /* Read the IP destination address and resolve the PDP context.
@@ -527,6 +527,10 @@ static int gtp_xmit_ip4(struct sk_buff *skb, struct 
net_device *dev)
                return -EMSGSIZE;
        }
 
+       sport = udp_flow_src_port(sock_net(pctx->sk), skb,
+                       0, USHRT_MAX,
+                       true);
+
        /* Ensure there is sufficient headroom. */
        r = skb_cow_head(skb, headroom);
        if (unlikely(r))
@@ -545,7 +549,7 @@ static int gtp_xmit_ip4(struct sk_buff *skb, struct 
net_device *dev)
                            iph->tos,
                            ip4_dst_hoplimit(&rt->dst),
                            0,
-                           port, port,
+                           sport, port,
                            !net_eq(sock_net(pctx->sk),
                                    dev_net(pctx->dev)),
                            false);
-- 
2.27.0

Reply via email to