diff options
Diffstat (limited to 'net/tipc/eth_media.c')
-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 | ||