diff options
| -rw-r--r-- | net/tipc/eth_media.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 6230d16020c4..81253d0b24b9 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
| @@ -72,17 +72,26 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | |||
| 72 | { | 72 | { |
| 73 | struct sk_buff *clone; | 73 | struct sk_buff *clone; |
| 74 | struct net_device *dev; | 74 | struct net_device *dev; |
| 75 | int delta; | ||
| 75 | 76 | ||
| 76 | clone = skb_clone(buf, GFP_ATOMIC); | 77 | clone = skb_clone(buf, GFP_ATOMIC); |
| 77 | if (clone) { | 78 | if (!clone) |
| 78 | skb_reset_network_header(clone); | 79 | return 0; |
| 79 | dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; | 80 | |
| 80 | clone->dev = dev; | 81 | dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; |
| 81 | dev_hard_header(clone, dev, ETH_P_TIPC, | 82 | delta = dev->hard_header_len - skb_headroom(buf); |
| 82 | &dest->dev_addr.eth_addr, | 83 | |
| 83 | dev->dev_addr, clone->len); | 84 | if ((delta > 0) && |
| 84 | dev_queue_xmit(clone); | 85 | pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) { |
| 86 | kfree_skb(clone); | ||
| 87 | return 0; | ||
| 85 | } | 88 | } |
| 89 | |||
| 90 | skb_reset_network_header(clone); | ||
| 91 | clone->dev = dev; | ||
| 92 | dev_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr, | ||
| 93 | dev->dev_addr, clone->len); | ||
| 94 | dev_queue_xmit(clone); | ||
| 86 | return 0; | 95 | return 0; |
| 87 | } | 96 | } |
| 88 | 97 | ||
