Skip to content

Commit e535679

Browse files
Jon Paul Maloydavem330
authored andcommitted
tipc: conditionally expand buffer headroom over udp tunnel
In commit d999297 ("tipc: reduce locking scope during packet reception") we altered the packet retransmission function. Since then, when restransmitting packets, we create a clone of the original buffer using __pskb_copy(skb, MIN_H_SIZE), where MIN_H_SIZE is the size of the area we want to have copied, but also the smallest possible TIPC packet size. The value of MIN_H_SIZE is 24. Unfortunately, __pskb_copy() also has the effect that the headroom of the cloned buffer takes the size MIN_H_SIZE. This is too small for carrying the packet over the UDP tunnel bearer, which requires a minimum headroom of 28 bytes. A change to just use pskb_copy() lets the clone inherit the original headroom of 80 bytes, but also assumes that the copied data area is of at least that size, something that is not always the case. So that is not a viable solution. We now fix this by adding a check for sufficient headroom in the transmit function of udp_media.c, and expanding it when necessary. Fixes: commit d999297 ("tipc: reduce locking scope during packet reception") Signed-off-by: Jon Maloy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7a4264a commit e535679

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

net/tipc/udp_media.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
/* IANA assigned UDP port */
5353
#define UDP_PORT_DEFAULT 6118
5454

55+
#define UDP_MIN_HEADROOM 28
56+
5557
static const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {
5658
[TIPC_NLA_UDP_UNSPEC] = {.type = NLA_UNSPEC},
5759
[TIPC_NLA_UDP_LOCAL] = {.type = NLA_BINARY,
@@ -156,6 +158,9 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
156158
struct sk_buff *clone;
157159
struct rtable *rt;
158160

161+
if (skb_headroom(skb) < UDP_MIN_HEADROOM)
162+
pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
163+
159164
clone = skb_clone(skb, GFP_ATOMIC);
160165
skb_set_inner_protocol(clone, htons(ETH_P_TIPC));
161166
ub = rcu_dereference_rtnl(b->media_ptr);

0 commit comments

Comments
 (0)