mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 08:34:20 +08:00
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: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5d9c54c1e9
commit
9fbfca0131
@ -72,17 +72,26 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
|
||||
{
|
||||
struct sk_buff *clone;
|
||||
struct net_device *dev;
|
||||
int delta;
|
||||
|
||||
clone = skb_clone(buf, GFP_ATOMIC);
|
||||
if (clone) {
|
||||
skb_reset_network_header(clone);
|
||||
if (!clone)
|
||||
return 0;
|
||||
|
||||
dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev;
|
||||
delta = dev->hard_header_len - skb_headroom(buf);
|
||||
|
||||
if ((delta > 0) &&
|
||||
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_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr,
|
||||
dev->dev_addr, clone->len);
|
||||
dev_queue_xmit(clone);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user