mirror of
https://github.com/torvalds/linux.git
synced 2024-12-23 19:31:53 +00:00
tipc: conditionally expand buffer headroom over udp tunnel
In commitd999297c3d
("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: commitd999297c3d
("tipc: reduce locking scope during packet reception") Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7a4264a925
commit
e53567948f
@ -52,6 +52,8 @@
|
||||
/* IANA assigned UDP port */
|
||||
#define UDP_PORT_DEFAULT 6118
|
||||
|
||||
#define UDP_MIN_HEADROOM 28
|
||||
|
||||
static const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {
|
||||
[TIPC_NLA_UDP_UNSPEC] = {.type = NLA_UNSPEC},
|
||||
[TIPC_NLA_UDP_LOCAL] = {.type = NLA_BINARY,
|
||||
@ -156,6 +158,9 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
|
||||
struct sk_buff *clone;
|
||||
struct rtable *rt;
|
||||
|
||||
if (skb_headroom(skb) < UDP_MIN_HEADROOM)
|
||||
pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
|
||||
|
||||
clone = skb_clone(skb, GFP_ATOMIC);
|
||||
skb_set_inner_protocol(clone, htons(ETH_P_TIPC));
|
||||
ub = rcu_dereference_rtnl(b->media_ptr);
|
||||
|
Loading…
Reference in New Issue
Block a user