Commit 0c4e85813d0a94eeb8bf813397a4907bdd7bb610
Committed by
David S. Miller
1 parent
4c94f8c0c9
Exists in
master
and in
7 other branches
[NET]: Wrap netdevice hardware header creation.
Add inline for common usage of hardware header creation, and fix bug in IPV6 mcast where the assumption about negative return is an errno. Negative return from hard_header means not enough space was available,(ie -N bytes). Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 19 changed files with 63 additions and 70 deletions Side-by-side Diff
- drivers/net/hamradio/bpqether.c
- drivers/net/macvlan.c
- drivers/net/pppoe.c
- drivers/net/wan/lapbether.c
- include/linux/netdevice.h
- include/net/dn_route.h
- net/802/p8023.c
- net/8021q/vlan_dev.c
- net/core/neighbour.c
- net/core/netpoll.c
- net/decnet/dn_neigh.c
- net/econet/af_econet.c
- net/ethernet/pe2.c
- net/ipv4/arp.c
- net/ipv4/ipconfig.c
- net/ipv6/mcast.c
- net/packet/af_packet.c
- net/sched/sch_teql.c
- net/tipc/eth_media.c
drivers/net/hamradio/bpqether.c
... | ... | @@ -286,7 +286,7 @@ |
286 | 286 | |
287 | 287 | skb->protocol = ax25_type_trans(skb, dev); |
288 | 288 | skb_reset_network_header(skb); |
289 | - dev->hard_header(skb, dev, ETH_P_BPQ, bpq->dest_addr, NULL, 0); | |
289 | + dev_hard_header(skb, dev, ETH_P_BPQ, bpq->dest_addr, NULL, 0); | |
290 | 290 | bpq->stats.tx_packets++; |
291 | 291 | bpq->stats.tx_bytes+=skb->len; |
292 | 292 |
drivers/net/macvlan.c
... | ... | @@ -170,8 +170,8 @@ |
170 | 170 | const struct macvlan_dev *vlan = netdev_priv(dev); |
171 | 171 | struct net_device *lowerdev = vlan->lowerdev; |
172 | 172 | |
173 | - return lowerdev->hard_header(skb, lowerdev, type, daddr, | |
174 | - saddr ? : dev->dev_addr, len); | |
173 | + return dev_hard_header(skb, lowerdev, type, daddr, | |
174 | + saddr ? : dev->dev_addr, len); | |
175 | 175 | } |
176 | 176 | |
177 | 177 | static int macvlan_open(struct net_device *dev) |
drivers/net/pppoe.c
... | ... | @@ -834,8 +834,8 @@ |
834 | 834 | } |
835 | 835 | |
836 | 836 | error = total_len; |
837 | - dev->hard_header(skb, dev, ETH_P_PPP_SES, | |
838 | - po->pppoe_pa.remote, NULL, total_len); | |
837 | + dev_hard_header(skb, dev, ETH_P_PPP_SES, | |
838 | + po->pppoe_pa.remote, NULL, total_len); | |
839 | 839 | |
840 | 840 | memcpy(ph, &hdr, sizeof(struct pppoe_hdr)); |
841 | 841 | |
... | ... | @@ -886,8 +886,8 @@ |
886 | 886 | skb->protocol = __constant_htons(ETH_P_PPP_SES); |
887 | 887 | skb->dev = dev; |
888 | 888 | |
889 | - dev->hard_header(skb, dev, ETH_P_PPP_SES, | |
890 | - po->pppoe_pa.remote, NULL, data_len); | |
889 | + dev_hard_header(skb, dev, ETH_P_PPP_SES, | |
890 | + po->pppoe_pa.remote, NULL, data_len); | |
891 | 891 | |
892 | 892 | dev_queue_xmit(skb); |
893 | 893 |
drivers/net/wan/lapbether.c
include/linux/netdevice.h
... | ... | @@ -800,6 +800,15 @@ |
800 | 800 | extern int netpoll_trap(void); |
801 | 801 | #endif |
802 | 802 | |
803 | +static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, | |
804 | + unsigned short type, | |
805 | + void *daddr, void *saddr, unsigned len) | |
806 | +{ | |
807 | + if (!dev->hard_header) | |
808 | + return 0; | |
809 | + return dev->hard_header(skb, dev, type, daddr, saddr, len); | |
810 | +} | |
811 | + | |
803 | 812 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); |
804 | 813 | extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf); |
805 | 814 | static inline int unregister_gifconf(unsigned int family) |
include/net/dn_route.h
... | ... | @@ -100,8 +100,7 @@ |
100 | 100 | if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_LOOPBACK)) |
101 | 101 | dst = NULL; |
102 | 102 | |
103 | - if (!dev->hard_header || (dev->hard_header(skb, dev, ETH_P_DNA_RT, | |
104 | - dst, src, skb->len) >= 0)) | |
103 | + if (dev_hard_header(skb, dev, ETH_P_DNA_RT, dst, src, skb->len) >= 0) | |
105 | 104 | dn_rt_send(skb); |
106 | 105 | else |
107 | 106 | kfree_skb(skb); |
net/802/p8023.c
net/8021q/vlan_dev.c
... | ... | @@ -434,21 +434,19 @@ |
434 | 434 | |
435 | 435 | if (build_vlan_header) { |
436 | 436 | /* Now make the underlying real hard header */ |
437 | - rc = dev->hard_header(skb, dev, ETH_P_8021Q, daddr, saddr, len + VLAN_HLEN); | |
438 | - | |
439 | - if (rc > 0) { | |
437 | + rc = dev_hard_header(skb, dev, ETH_P_8021Q, daddr, saddr, | |
438 | + len + VLAN_HLEN); | |
439 | + if (rc > 0) | |
440 | 440 | rc += VLAN_HLEN; |
441 | - } else if (rc < 0) { | |
441 | + else if (rc < 0) | |
442 | 442 | rc -= VLAN_HLEN; |
443 | - } | |
444 | - } else { | |
443 | + } else | |
445 | 444 | /* If here, then we'll just make a normal looking ethernet frame, |
446 | 445 | * but, the hard_start_xmit method will insert the tag (it has to |
447 | 446 | * be able to do this for bridged and other skbs that don't come |
448 | 447 | * down the protocol stack in an orderly manner. |
449 | 448 | */ |
450 | - rc = dev->hard_header(skb, dev, type, daddr, saddr, len); | |
451 | - } | |
449 | + rc = dev_hard_header(skb, dev, type, daddr, saddr, len); | |
452 | 450 | |
453 | 451 | return rc; |
454 | 452 | } |
net/core/neighbour.c
... | ... | @@ -1125,9 +1125,8 @@ |
1125 | 1125 | |
1126 | 1126 | __skb_pull(skb, skb_network_offset(skb)); |
1127 | 1127 | |
1128 | - if (dev->hard_header && | |
1129 | - dev->hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, | |
1130 | - skb->len) < 0 && | |
1128 | + if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, | |
1129 | + skb->len) < 0 && | |
1131 | 1130 | dev->rebuild_header(skb)) |
1132 | 1131 | return 0; |
1133 | 1132 | |
1134 | 1133 | |
... | ... | @@ -1154,13 +1153,13 @@ |
1154 | 1153 | write_lock_bh(&neigh->lock); |
1155 | 1154 | if (!dst->hh) |
1156 | 1155 | neigh_hh_init(neigh, dst, dst->ops->protocol); |
1157 | - err = dev->hard_header(skb, dev, ntohs(skb->protocol), | |
1158 | - neigh->ha, NULL, skb->len); | |
1156 | + err = dev_hard_header(skb, dev, ntohs(skb->protocol), | |
1157 | + neigh->ha, NULL, skb->len); | |
1159 | 1158 | write_unlock_bh(&neigh->lock); |
1160 | 1159 | } else { |
1161 | 1160 | read_lock_bh(&neigh->lock); |
1162 | - err = dev->hard_header(skb, dev, ntohs(skb->protocol), | |
1163 | - neigh->ha, NULL, skb->len); | |
1161 | + err = dev_hard_header(skb, dev, ntohs(skb->protocol), | |
1162 | + neigh->ha, NULL, skb->len); | |
1164 | 1163 | read_unlock_bh(&neigh->lock); |
1165 | 1164 | } |
1166 | 1165 | if (err >= 0) |
... | ... | @@ -1191,8 +1190,8 @@ |
1191 | 1190 | __skb_pull(skb, skb_network_offset(skb)); |
1192 | 1191 | |
1193 | 1192 | read_lock_bh(&neigh->lock); |
1194 | - err = dev->hard_header(skb, dev, ntohs(skb->protocol), | |
1195 | - neigh->ha, NULL, skb->len); | |
1193 | + err = dev_hard_header(skb, dev, ntohs(skb->protocol), | |
1194 | + neigh->ha, NULL, skb->len); | |
1196 | 1195 | read_unlock_bh(&neigh->lock); |
1197 | 1196 | if (err >= 0) |
1198 | 1197 | err = neigh->ops->queue_xmit(skb); |
net/core/netpoll.c
... | ... | @@ -415,11 +415,9 @@ |
415 | 415 | send_skb->protocol = htons(ETH_P_ARP); |
416 | 416 | |
417 | 417 | /* Fill the device header for the ARP frame */ |
418 | - | |
419 | - if (np->dev->hard_header && | |
420 | - np->dev->hard_header(send_skb, skb->dev, ptype, | |
421 | - sha, np->local_mac, | |
422 | - send_skb->len) < 0) { | |
418 | + if (dev_hard_header(send_skb, skb->dev, ptype, | |
419 | + sha, np->local_mac, | |
420 | + send_skb->len) < 0) { | |
423 | 421 | kfree_skb(send_skb); |
424 | 422 | return; |
425 | 423 | } |
net/decnet/dn_neigh.c
... | ... | @@ -211,7 +211,8 @@ |
211 | 211 | char mac_addr[ETH_ALEN]; |
212 | 212 | |
213 | 213 | dn_dn2eth(mac_addr, rt->rt_local_src); |
214 | - if (!dev->hard_header || dev->hard_header(skb, dev, ntohs(skb->protocol), neigh->ha, mac_addr, skb->len) >= 0) | |
214 | + if (dev_hard_header(skb, dev, ntohs(skb->protocol), neigh->ha, | |
215 | + mac_addr, skb->len) >= 0) | |
215 | 216 | return neigh->ops->queue_xmit(skb); |
216 | 217 | |
217 | 218 | if (net_ratelimit()) |
net/econet/af_econet.c
... | ... | @@ -336,6 +336,7 @@ |
336 | 336 | /* Real hardware Econet. We're not worthy etc. */ |
337 | 337 | #ifdef CONFIG_ECONET_NATIVE |
338 | 338 | unsigned short proto = 0; |
339 | + int res; | |
339 | 340 | |
340 | 341 | dev_hold(dev); |
341 | 342 | |
342 | 343 | |
... | ... | @@ -354,12 +355,12 @@ |
354 | 355 | eb->sec = *saddr; |
355 | 356 | eb->sent = ec_tx_done; |
356 | 357 | |
357 | - if (dev->hard_header) { | |
358 | - int res; | |
358 | + err = -EINVAL; | |
359 | + res = dev_hard_header(skb, dev, ntohs(proto), &addr, NULL, len); | |
360 | + if (res < 0) | |
361 | + goto out_free; | |
362 | + if (res > 0) { | |
359 | 363 | struct ec_framehdr *fh; |
360 | - err = -EINVAL; | |
361 | - res = dev->hard_header(skb, dev, ntohs(proto), | |
362 | - &addr, NULL, len); | |
363 | 364 | /* Poke in our control byte and |
364 | 365 | port number. Hack, hack. */ |
365 | 366 | fh = (struct ec_framehdr *)(skb->data); |
... | ... | @@ -368,8 +369,7 @@ |
368 | 369 | if (sock->type != SOCK_DGRAM) { |
369 | 370 | skb_reset_tail_pointer(skb); |
370 | 371 | skb->len = 0; |
371 | - } else if (res < 0) | |
372 | - goto out_free; | |
372 | + } | |
373 | 373 | } |
374 | 374 | |
375 | 375 | /* Copy the data. Returns -EFAULT on error */ |
net/ethernet/pe2.c
... | ... | @@ -12,9 +12,7 @@ |
12 | 12 | struct net_device *dev = skb->dev; |
13 | 13 | |
14 | 14 | skb->protocol = htons(ETH_P_IPX); |
15 | - if (dev->hard_header) | |
16 | - dev->hard_header(skb, dev, ETH_P_IPX, | |
17 | - dest_node, NULL, skb->len); | |
15 | + dev_hard_header(skb, dev, ETH_P_IPX, dest_node, NULL, skb->len); | |
18 | 16 | return dev_queue_xmit(skb); |
19 | 17 | } |
20 | 18 |
net/ipv4/arp.c
... | ... | @@ -591,8 +591,7 @@ |
591 | 591 | /* |
592 | 592 | * Fill the device header for the ARP frame |
593 | 593 | */ |
594 | - if (dev->hard_header && | |
595 | - dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb->len) < 0) | |
594 | + if (dev_hard_header(skb, dev, ptype, dest_hw, src_hw, skb->len) < 0) | |
596 | 595 | goto out; |
597 | 596 | |
598 | 597 | /* |
net/ipv4/ipconfig.c
... | ... | @@ -757,8 +757,8 @@ |
757 | 757 | /* Chain packet down the line... */ |
758 | 758 | skb->dev = dev; |
759 | 759 | skb->protocol = htons(ETH_P_IP); |
760 | - if ((dev->hard_header && | |
761 | - dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || | |
760 | + if (dev_hard_header(skb, dev, ntohs(skb->protocol), | |
761 | + dev->broadcast, dev->dev_addr, skb->len) < 0 || | |
762 | 762 | dev_queue_xmit(skb) < 0) |
763 | 763 | printk("E"); |
764 | 764 | } |
net/ipv6/mcast.c
... | ... | @@ -1438,17 +1438,12 @@ |
1438 | 1438 | static inline int mld_dev_queue_xmit2(struct sk_buff *skb) |
1439 | 1439 | { |
1440 | 1440 | struct net_device *dev = skb->dev; |
1441 | + unsigned char ha[MAX_ADDR_LEN]; | |
1441 | 1442 | |
1442 | - if (dev->hard_header) { | |
1443 | - unsigned char ha[MAX_ADDR_LEN]; | |
1444 | - int err; | |
1445 | - | |
1446 | - ndisc_mc_map(&ipv6_hdr(skb)->daddr, ha, dev, 1); | |
1447 | - err = dev->hard_header(skb, dev, ETH_P_IPV6, ha, NULL, skb->len); | |
1448 | - if (err < 0) { | |
1449 | - kfree_skb(skb); | |
1450 | - return err; | |
1451 | - } | |
1443 | + ndisc_mc_map(&ipv6_hdr(skb)->daddr, ha, dev, 1); | |
1444 | + if (dev_hard_header(skb, dev, ETH_P_IPV6, ha, NULL, skb->len) < 0) { | |
1445 | + kfree_skb(skb); | |
1446 | + return -EINVAL; | |
1452 | 1447 | } |
1453 | 1448 | return dev_queue_xmit(skb); |
1454 | 1449 | } |
net/packet/af_packet.c
... | ... | @@ -765,16 +765,10 @@ |
765 | 765 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
766 | 766 | skb_reset_network_header(skb); |
767 | 767 | |
768 | - if (dev->hard_header) { | |
769 | - int res; | |
770 | - err = -EINVAL; | |
771 | - res = dev->hard_header(skb, dev, ntohs(proto), addr, NULL, len); | |
772 | - if (sock->type != SOCK_DGRAM) { | |
773 | - skb_reset_tail_pointer(skb); | |
774 | - skb->len = 0; | |
775 | - } else if (res < 0) | |
776 | - goto out_free; | |
777 | - } | |
768 | + err = -EINVAL; | |
769 | + if (sock->type == SOCK_DGRAM && | |
770 | + dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len) < 0) | |
771 | + goto out_free; | |
778 | 772 | |
779 | 773 | /* Returns -EFAULT on error */ |
780 | 774 | err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len); |
net/sched/sch_teql.c
... | ... | @@ -232,9 +232,12 @@ |
232 | 232 | } |
233 | 233 | if (neigh_event_send(n, skb_res) == 0) { |
234 | 234 | int err; |
235 | + | |
235 | 236 | read_lock(&n->lock); |
236 | - err = dev->hard_header(skb, dev, ntohs(skb->protocol), n->ha, NULL, skb->len); | |
237 | + err = dev_hard_header(skb, dev, ntohs(skb->protocol), | |
238 | + n->ha, NULL, skb->len); | |
237 | 239 | read_unlock(&n->lock); |
240 | + | |
238 | 241 | if (err < 0) { |
239 | 242 | neigh_release(n); |
240 | 243 | return -EINVAL; |
net/tipc/eth_media.c
... | ... | @@ -77,7 +77,7 @@ |
77 | 77 | skb_reset_network_header(clone); |
78 | 78 | dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; |
79 | 79 | clone->dev = dev; |
80 | - dev->hard_header(clone, dev, ETH_P_TIPC, | |
80 | + dev_hard_header(clone, dev, ETH_P_TIPC, | |
81 | 81 | &dest->dev_addr.eth_addr, |
82 | 82 | dev->dev_addr, clone->len); |
83 | 83 | dev_queue_xmit(clone); |