diff options
-rw-r--r-- | net/atm/br2684.c | 121 |
1 files changed, 0 insertions, 121 deletions
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index c742d37bfb97..ba6428f204f9 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -24,16 +24,6 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hungary | |||
24 | 24 | ||
25 | #include "common.h" | 25 | #include "common.h" |
26 | 26 | ||
27 | /* | ||
28 | * Define this to use a version of the code which interacts with the higher | ||
29 | * layers in a more intellegent way, by always reserving enough space for | ||
30 | * our header at the begining of the packet. However, there may still be | ||
31 | * some problems with programs like tcpdump. In 2.5 we'll sort out what | ||
32 | * we need to do to get this perfect. For now we just will copy the packet | ||
33 | * if we need space for the header | ||
34 | */ | ||
35 | /* #define FASTER_VERSION */ | ||
36 | |||
37 | #ifdef SKB_DEBUG | 27 | #ifdef SKB_DEBUG |
38 | static void skb_debug(const struct sk_buff *skb) | 28 | static void skb_debug(const struct sk_buff *skb) |
39 | { | 29 | { |
@@ -69,9 +59,7 @@ struct br2684_vcc { | |||
69 | #ifdef CONFIG_ATM_BR2684_IPFILTER | 59 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
70 | struct br2684_filter filter; | 60 | struct br2684_filter filter; |
71 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ | 61 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ |
72 | #ifndef FASTER_VERSION | ||
73 | unsigned copies_needed, copies_failed; | 62 | unsigned copies_needed, copies_failed; |
74 | #endif /* FASTER_VERSION */ | ||
75 | }; | 63 | }; |
76 | 64 | ||
77 | struct br2684_dev { | 65 | struct br2684_dev { |
@@ -147,13 +135,6 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev, | |||
147 | struct br2684_vcc *brvcc) | 135 | struct br2684_vcc *brvcc) |
148 | { | 136 | { |
149 | struct atm_vcc *atmvcc; | 137 | struct atm_vcc *atmvcc; |
150 | #ifdef FASTER_VERSION | ||
151 | if (brvcc->encaps == e_llc) | ||
152 | memcpy(skb_push(skb, 8), llc_oui_pid_pad, 8); | ||
153 | /* last 2 bytes of llc_oui_pid_pad are managed by header routines; | ||
154 | yes, you got it: 8 + 2 = sizeof(llc_oui_pid_pad) | ||
155 | */ | ||
156 | #else | ||
157 | int minheadroom = (brvcc->encaps == e_llc) ? 10 : 2; | 138 | int minheadroom = (brvcc->encaps == e_llc) ? 10 : 2; |
158 | if (skb_headroom(skb) < minheadroom) { | 139 | if (skb_headroom(skb) < minheadroom) { |
159 | struct sk_buff *skb2 = skb_realloc_headroom(skb, minheadroom); | 140 | struct sk_buff *skb2 = skb_realloc_headroom(skb, minheadroom); |
@@ -170,7 +151,6 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev, | |||
170 | skb_copy_to_linear_data(skb, llc_oui_pid_pad, 10); | 151 | skb_copy_to_linear_data(skb, llc_oui_pid_pad, 10); |
171 | else | 152 | else |
172 | memset(skb->data, 0, 2); | 153 | memset(skb->data, 0, 2); |
173 | #endif /* FASTER_VERSION */ | ||
174 | skb_debug(skb); | 154 | skb_debug(skb); |
175 | 155 | ||
176 | ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc; | 156 | ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc; |
@@ -237,87 +217,6 @@ static struct net_device_stats *br2684_get_stats(struct net_device *dev) | |||
237 | return &BRPRIV(dev)->stats; | 217 | return &BRPRIV(dev)->stats; |
238 | } | 218 | } |
239 | 219 | ||
240 | #ifdef FASTER_VERSION | ||
241 | /* | ||
242 | * These mirror eth_header and eth_header_cache. They are not usually | ||
243 | * exported for use in modules, so we grab them from net_device | ||
244 | * after ether_setup() is done with it. Bit of a hack. | ||
245 | */ | ||
246 | static int (*my_eth_header)(struct sk_buff *, struct net_device *, | ||
247 | unsigned short, void *, void *, unsigned); | ||
248 | static int (*my_eth_header_cache)(struct neighbour *, struct hh_cache *); | ||
249 | |||
250 | static int | ||
251 | br2684_header(struct sk_buff *skb, struct net_device *dev, | ||
252 | unsigned short type, void *daddr, void *saddr, unsigned len) | ||
253 | { | ||
254 | u16 *pad_before_eth; | ||
255 | int t = my_eth_header(skb, dev, type, daddr, saddr, len); | ||
256 | if (t > 0) { | ||
257 | pad_before_eth = (u16 *) skb_push(skb, 2); | ||
258 | *pad_before_eth = 0; | ||
259 | return dev->hard_header_len; /* or return 16; ? */ | ||
260 | } else | ||
261 | return t; | ||
262 | } | ||
263 | |||
264 | static int | ||
265 | br2684_header_cache(struct neighbour *neigh, struct hh_cache *hh) | ||
266 | { | ||
267 | /* hh_data is 16 bytes long. if encaps is ether-llc we need 24, so | ||
268 | xmit will add the additional header part in that case */ | ||
269 | u16 *pad_before_eth = (u16 *)(hh->hh_data); | ||
270 | int t = my_eth_header_cache(neigh, hh); | ||
271 | DPRINTK("br2684_header_cache, neigh=%p, hh_cache=%p\n", neigh, hh); | ||
272 | if (t < 0) | ||
273 | return t; | ||
274 | else { | ||
275 | *pad_before_eth = 0; | ||
276 | hh->hh_len = PADLEN + ETH_HLEN; | ||
277 | } | ||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | /* | ||
282 | * This is similar to eth_type_trans, which cannot be used because of | ||
283 | * our dev->hard_header_len | ||
284 | */ | ||
285 | static inline __be16 br_type_trans(struct sk_buff *skb, struct net_device *dev) | ||
286 | { | ||
287 | struct ethhdr *eth; | ||
288 | unsigned char *rawp; | ||
289 | eth = eth_hdr(skb); | ||
290 | |||
291 | if (is_multicast_ether_addr(eth->h_dest)) { | ||
292 | if (!compare_ether_addr(eth->h_dest, dev->broadcast)) | ||
293 | skb->pkt_type = PACKET_BROADCAST; | ||
294 | else | ||
295 | skb->pkt_type = PACKET_MULTICAST; | ||
296 | } | ||
297 | |||
298 | else if (compare_ether_addr(eth->h_dest, dev->dev_addr)) | ||
299 | skb->pkt_type = PACKET_OTHERHOST; | ||
300 | |||
301 | if (ntohs(eth->h_proto) >= 1536) | ||
302 | return eth->h_proto; | ||
303 | |||
304 | rawp = skb->data; | ||
305 | |||
306 | /* | ||
307 | * This is a magic hack to spot IPX packets. Older Novell breaks | ||
308 | * the protocol design and runs IPX over 802.3 without an 802.2 LLC | ||
309 | * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This | ||
310 | * won't work for fault tolerant netware but does for the rest. | ||
311 | */ | ||
312 | if (*(unsigned short *) rawp == 0xFFFF) | ||
313 | return htons(ETH_P_802_3); | ||
314 | |||
315 | /* | ||
316 | * Real 802.2 LLC | ||
317 | */ | ||
318 | return htons(ETH_P_802_2); | ||
319 | } | ||
320 | #endif /* FASTER_VERSION */ | ||
321 | 220 | ||
322 | /* | 221 | /* |
323 | * We remember when the MAC gets set, so we don't override it later with | 222 | * We remember when the MAC gets set, so we don't override it later with |
@@ -448,17 +347,8 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) | |||
448 | return; | 347 | return; |
449 | } | 348 | } |
450 | 349 | ||
451 | #ifdef FASTER_VERSION | ||
452 | /* FIXME: tcpdump shows that pointer to mac header is 2 bytes earlier, | ||
453 | than should be. What else should I set? */ | ||
454 | skb_pull(skb, plen); | ||
455 | skb_set_mac_header(skb, -ETH_HLEN); | ||
456 | skb->pkt_type = PACKET_HOST; | ||
457 | skb->protocol = br_type_trans(skb, net_dev); | ||
458 | #else | ||
459 | skb_pull(skb, plen - ETH_HLEN); | 350 | skb_pull(skb, plen - ETH_HLEN); |
460 | skb->protocol = eth_type_trans(skb, net_dev); | 351 | skb->protocol = eth_type_trans(skb, net_dev); |
461 | #endif /* FASTER_VERSION */ | ||
462 | #ifdef CONFIG_ATM_BR2684_IPFILTER | 352 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
463 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) { | 353 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) { |
464 | brdev->stats.rx_dropped++; | 354 | brdev->stats.rx_dropped++; |
@@ -584,13 +474,6 @@ static void br2684_setup(struct net_device *netdev) | |||
584 | ether_setup(netdev); | 474 | ether_setup(netdev); |
585 | brdev->net_dev = netdev; | 475 | brdev->net_dev = netdev; |
586 | 476 | ||
587 | #ifdef FASTER_VERSION | ||
588 | my_eth_header = netdev->hard_header; | ||
589 | netdev->hard_header = br2684_header; | ||
590 | my_eth_header_cache = netdev->hard_header_cache; | ||
591 | netdev->hard_header_cache = br2684_header_cache; | ||
592 | netdev->hard_header_len = sizeof(llc_oui_pid_pad) + ETH_HLEN; /* 10 + 14 */ | ||
593 | #endif | ||
594 | my_eth_mac_addr = netdev->set_mac_address; | 477 | my_eth_mac_addr = netdev->set_mac_address; |
595 | netdev->set_mac_address = br2684_mac_addr; | 478 | netdev->set_mac_address = br2684_mac_addr; |
596 | netdev->hard_start_xmit = br2684_start_xmit; | 479 | netdev->hard_start_xmit = br2684_start_xmit; |
@@ -719,16 +602,12 @@ static int br2684_seq_show(struct seq_file *seq, void *v) | |||
719 | 602 | ||
720 | list_for_each_entry(brvcc, &brdev->brvccs, brvccs) { | 603 | list_for_each_entry(brvcc, &brdev->brvccs, brvccs) { |
721 | seq_printf(seq, " vcc %d.%d.%d: encaps=%s" | 604 | seq_printf(seq, " vcc %d.%d.%d: encaps=%s" |
722 | #ifndef FASTER_VERSION | ||
723 | ", failed copies %u/%u" | 605 | ", failed copies %u/%u" |
724 | #endif /* FASTER_VERSION */ | ||
725 | "\n", brvcc->atmvcc->dev->number, | 606 | "\n", brvcc->atmvcc->dev->number, |
726 | brvcc->atmvcc->vpi, brvcc->atmvcc->vci, | 607 | brvcc->atmvcc->vpi, brvcc->atmvcc->vci, |
727 | (brvcc->encaps == e_llc) ? "LLC" : "VC" | 608 | (brvcc->encaps == e_llc) ? "LLC" : "VC" |
728 | #ifndef FASTER_VERSION | ||
729 | , brvcc->copies_failed | 609 | , brvcc->copies_failed |
730 | , brvcc->copies_needed | 610 | , brvcc->copies_needed |
731 | #endif /* FASTER_VERSION */ | ||
732 | ); | 611 | ); |
733 | #ifdef CONFIG_ATM_BR2684_IPFILTER | 612 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
734 | #define b1(var, byte) ((u8 *) &brvcc->filter.var)[byte] | 613 | #define b1(var, byte) ((u8 *) &brvcc->filter.var)[byte] |