提交 9fbfca01 编写于 作者: A Allan Stephens 提交者: David S. Miller

tipc: Ensure outgoing messages on Ethernet have sufficient headroom

Add code to expand the headroom of an outgoing TIPC message if the
sk_buff has insufficient room to hold the header for the associated
Ethernet device.  This change is necessary to ensure that messages
TIPC does not create itself (eg. incoming messages that are being
routed to another node) do not cause problems, since TIPC has no
control over the amount of headroom available in such messages.
Signed-off-by: NAllan Stephens <allan.stephens@windriver.com>
Signed-off-by: NPaul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 5d9c54c1
...@@ -72,17 +72,26 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, ...@@ -72,17 +72,26 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
{ {
struct sk_buff *clone; struct sk_buff *clone;
struct net_device *dev; struct net_device *dev;
int delta;
clone = skb_clone(buf, GFP_ATOMIC); clone = skb_clone(buf, GFP_ATOMIC);
if (clone) { if (!clone)
skb_reset_network_header(clone); return 0;
dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev;
clone->dev = dev; dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev;
dev_hard_header(clone, dev, ETH_P_TIPC, delta = dev->hard_header_len - skb_headroom(buf);
&dest->dev_addr.eth_addr,
dev->dev_addr, clone->len); if ((delta > 0) &&
dev_queue_xmit(clone); pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
kfree_skb(clone);
return 0;
} }
skb_reset_network_header(clone);
clone->dev = dev;
dev_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr,
dev->dev_addr, clone->len);
dev_queue_xmit(clone);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册