Commit 0c4e85813d0a94eeb8bf813397a4907bdd7bb610

Authored by Stephen Hemminger
Committed by David S. Miller
1 parent 4c94f8c0c9

[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
... ... @@ -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)
... ... @@ -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
... ... @@ -216,7 +216,7 @@
216 216  
217 217 skb->dev = dev = lapbeth->ethdev;
218 218  
219   - dev->hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
  219 + dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
220 220  
221 221 dev_queue_xmit(skb);
222 222 }
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);
... ... @@ -31,7 +31,7 @@
31 31 {
32 32 struct net_device *dev = skb->dev;
33 33  
34   - dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len);
  34 + dev_hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len);
35 35 return dev_queue_xmit(skb);
36 36 }
37 37  
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);
... ... @@ -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 */
... ... @@ -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  
... ... @@ -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 /*
... ... @@ -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 }
... ... @@ -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);