diff options
Diffstat (limited to 'net/atm')
-rw-r--r-- | net/atm/br2684.c | 28 | ||||
-rw-r--r-- | net/atm/clip.c | 42 | ||||
-rw-r--r-- | net/atm/lec.c | 20 |
3 files changed, 32 insertions, 58 deletions
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 3100a8940afc..2912665fc58c 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -228,7 +228,7 @@ static int br2684_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
228 | struct br2684_dev *brdev = BRPRIV(dev); | 228 | struct br2684_dev *brdev = BRPRIV(dev); |
229 | struct br2684_vcc *brvcc; | 229 | struct br2684_vcc *brvcc; |
230 | 230 | ||
231 | pr_debug("br2684_start_xmit, skb->dst=%p\n", skb->dst); | 231 | pr_debug("br2684_start_xmit, skb_dst(skb)=%p\n", skb_dst(skb)); |
232 | read_lock(&devs_lock); | 232 | read_lock(&devs_lock); |
233 | brvcc = pick_outgoing_vcc(skb, brdev); | 233 | brvcc = pick_outgoing_vcc(skb, brdev); |
234 | if (brvcc == NULL) { | 234 | if (brvcc == NULL) { |
@@ -445,9 +445,10 @@ free_skb: | |||
445 | */ | 445 | */ |
446 | static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) | 446 | static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) |
447 | { | 447 | { |
448 | struct sk_buff_head queue; | ||
448 | int err; | 449 | int err; |
449 | struct br2684_vcc *brvcc; | 450 | struct br2684_vcc *brvcc; |
450 | struct sk_buff *skb; | 451 | struct sk_buff *skb, *tmp; |
451 | struct sk_buff_head *rq; | 452 | struct sk_buff_head *rq; |
452 | struct br2684_dev *brdev; | 453 | struct br2684_dev *brdev; |
453 | struct net_device *net_dev; | 454 | struct net_device *net_dev; |
@@ -505,29 +506,20 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) | |||
505 | barrier(); | 506 | barrier(); |
506 | atmvcc->push = br2684_push; | 507 | atmvcc->push = br2684_push; |
507 | 508 | ||
509 | __skb_queue_head_init(&queue); | ||
508 | rq = &sk_atm(atmvcc)->sk_receive_queue; | 510 | rq = &sk_atm(atmvcc)->sk_receive_queue; |
509 | 511 | ||
510 | spin_lock_irqsave(&rq->lock, flags); | 512 | spin_lock_irqsave(&rq->lock, flags); |
511 | if (skb_queue_empty(rq)) { | 513 | skb_queue_splice_init(rq, &queue); |
512 | skb = NULL; | ||
513 | } else { | ||
514 | /* NULL terminate the list. */ | ||
515 | rq->prev->next = NULL; | ||
516 | skb = rq->next; | ||
517 | } | ||
518 | rq->prev = rq->next = (struct sk_buff *)rq; | ||
519 | rq->qlen = 0; | ||
520 | spin_unlock_irqrestore(&rq->lock, flags); | 514 | spin_unlock_irqrestore(&rq->lock, flags); |
521 | 515 | ||
522 | while (skb) { | 516 | skb_queue_walk_safe(&queue, skb, tmp) { |
523 | struct sk_buff *next = skb->next; | 517 | struct net_device *dev = skb->dev; |
524 | 518 | ||
525 | skb->next = skb->prev = NULL; | 519 | dev->stats.rx_bytes -= skb->len; |
526 | br2684_push(atmvcc, skb); | 520 | dev->stats.rx_packets--; |
527 | skb->dev->stats.rx_bytes -= skb->len; | ||
528 | skb->dev->stats.rx_packets--; | ||
529 | 521 | ||
530 | skb = next; | 522 | br2684_push(atmvcc, skb); |
531 | } | 523 | } |
532 | __module_get(THIS_MODULE); | 524 | __module_get(THIS_MODULE); |
533 | return 0; | 525 | return 0; |
diff --git a/net/atm/clip.c b/net/atm/clip.c index 3dc0a3a42a57..e65a3b1477f8 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
@@ -369,16 +369,16 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
369 | unsigned long flags; | 369 | unsigned long flags; |
370 | 370 | ||
371 | pr_debug("clip_start_xmit (skb %p)\n", skb); | 371 | pr_debug("clip_start_xmit (skb %p)\n", skb); |
372 | if (!skb->dst) { | 372 | if (!skb_dst(skb)) { |
373 | printk(KERN_ERR "clip_start_xmit: skb->dst == NULL\n"); | 373 | printk(KERN_ERR "clip_start_xmit: skb_dst(skb) == NULL\n"); |
374 | dev_kfree_skb(skb); | 374 | dev_kfree_skb(skb); |
375 | dev->stats.tx_dropped++; | 375 | dev->stats.tx_dropped++; |
376 | return 0; | 376 | return 0; |
377 | } | 377 | } |
378 | if (!skb->dst->neighbour) { | 378 | if (!skb_dst(skb)->neighbour) { |
379 | #if 0 | 379 | #if 0 |
380 | skb->dst->neighbour = clip_find_neighbour(skb->dst, 1); | 380 | skb_dst(skb)->neighbour = clip_find_neighbour(skb_dst(skb), 1); |
381 | if (!skb->dst->neighbour) { | 381 | if (!skb_dst(skb)->neighbour) { |
382 | dev_kfree_skb(skb); /* lost that one */ | 382 | dev_kfree_skb(skb); /* lost that one */ |
383 | dev->stats.tx_dropped++; | 383 | dev->stats.tx_dropped++; |
384 | return 0; | 384 | return 0; |
@@ -389,7 +389,7 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
389 | dev->stats.tx_dropped++; | 389 | dev->stats.tx_dropped++; |
390 | return 0; | 390 | return 0; |
391 | } | 391 | } |
392 | entry = NEIGH2ENTRY(skb->dst->neighbour); | 392 | entry = NEIGH2ENTRY(skb_dst(skb)->neighbour); |
393 | if (!entry->vccs) { | 393 | if (!entry->vccs) { |
394 | if (time_after(jiffies, entry->expires)) { | 394 | if (time_after(jiffies, entry->expires)) { |
395 | /* should be resolved */ | 395 | /* should be resolved */ |
@@ -406,7 +406,7 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
406 | } | 406 | } |
407 | pr_debug("neigh %p, vccs %p\n", entry, entry->vccs); | 407 | pr_debug("neigh %p, vccs %p\n", entry, entry->vccs); |
408 | ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; | 408 | ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; |
409 | pr_debug("using neighbour %p, vcc %p\n", skb->dst->neighbour, vcc); | 409 | pr_debug("using neighbour %p, vcc %p\n", skb_dst(skb)->neighbour, vcc); |
410 | if (entry->vccs->encap) { | 410 | if (entry->vccs->encap) { |
411 | void *here; | 411 | void *here; |
412 | 412 | ||
@@ -445,9 +445,9 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
445 | 445 | ||
446 | static int clip_mkip(struct atm_vcc *vcc, int timeout) | 446 | static int clip_mkip(struct atm_vcc *vcc, int timeout) |
447 | { | 447 | { |
448 | struct sk_buff_head *rq, queue; | ||
448 | struct clip_vcc *clip_vcc; | 449 | struct clip_vcc *clip_vcc; |
449 | struct sk_buff *skb; | 450 | struct sk_buff *skb, *tmp; |
450 | struct sk_buff_head *rq; | ||
451 | unsigned long flags; | 451 | unsigned long flags; |
452 | 452 | ||
453 | if (!vcc->push) | 453 | if (!vcc->push) |
@@ -469,39 +469,28 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) | |||
469 | vcc->push = clip_push; | 469 | vcc->push = clip_push; |
470 | vcc->pop = clip_pop; | 470 | vcc->pop = clip_pop; |
471 | 471 | ||
472 | __skb_queue_head_init(&queue); | ||
472 | rq = &sk_atm(vcc)->sk_receive_queue; | 473 | rq = &sk_atm(vcc)->sk_receive_queue; |
473 | 474 | ||
474 | spin_lock_irqsave(&rq->lock, flags); | 475 | spin_lock_irqsave(&rq->lock, flags); |
475 | if (skb_queue_empty(rq)) { | 476 | skb_queue_splice_init(rq, &queue); |
476 | skb = NULL; | ||
477 | } else { | ||
478 | /* NULL terminate the list. */ | ||
479 | rq->prev->next = NULL; | ||
480 | skb = rq->next; | ||
481 | } | ||
482 | rq->prev = rq->next = (struct sk_buff *)rq; | ||
483 | rq->qlen = 0; | ||
484 | spin_unlock_irqrestore(&rq->lock, flags); | 477 | spin_unlock_irqrestore(&rq->lock, flags); |
485 | 478 | ||
486 | /* re-process everything received between connection setup and MKIP */ | 479 | /* re-process everything received between connection setup and MKIP */ |
487 | while (skb) { | 480 | skb_queue_walk_safe(&queue, skb, tmp) { |
488 | struct sk_buff *next = skb->next; | ||
489 | |||
490 | skb->next = skb->prev = NULL; | ||
491 | if (!clip_devs) { | 481 | if (!clip_devs) { |
492 | atm_return(vcc, skb->truesize); | 482 | atm_return(vcc, skb->truesize); |
493 | kfree_skb(skb); | 483 | kfree_skb(skb); |
494 | } else { | 484 | } else { |
485 | struct net_device *dev = skb->dev; | ||
495 | unsigned int len = skb->len; | 486 | unsigned int len = skb->len; |
496 | 487 | ||
497 | skb_get(skb); | 488 | skb_get(skb); |
498 | clip_push(vcc, skb); | 489 | clip_push(vcc, skb); |
499 | skb->dev->stats.rx_packets--; | 490 | dev->stats.rx_packets--; |
500 | skb->dev->stats.rx_bytes -= len; | 491 | dev->stats.rx_bytes -= len; |
501 | kfree_skb(skb); | 492 | kfree_skb(skb); |
502 | } | 493 | } |
503 | |||
504 | skb = next; | ||
505 | } | 494 | } |
506 | return 0; | 495 | return 0; |
507 | } | 496 | } |
@@ -568,6 +557,7 @@ static void clip_setup(struct net_device *dev) | |||
568 | /* without any more elaborate queuing. 100 is a reasonable */ | 557 | /* without any more elaborate queuing. 100 is a reasonable */ |
569 | /* compromise between decent burst-tolerance and protection */ | 558 | /* compromise between decent burst-tolerance and protection */ |
570 | /* against memory hogs. */ | 559 | /* against memory hogs. */ |
560 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | ||
571 | } | 561 | } |
572 | 562 | ||
573 | static int clip_create(int number) | 563 | static int clip_create(int number) |
diff --git a/net/atm/lec.c b/net/atm/lec.c index 199b6bb79f42..ff2e594dca9b 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c | |||
@@ -34,7 +34,6 @@ | |||
34 | 34 | ||
35 | /* Proxy LEC knows about bridging */ | 35 | /* Proxy LEC knows about bridging */ |
36 | #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) | 36 | #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) |
37 | #include <linux/if_bridge.h> | ||
38 | #include "../bridge/br_private.h" | 37 | #include "../bridge/br_private.h" |
39 | 38 | ||
40 | static unsigned char bridge_ula_lec[] = { 0x01, 0x80, 0xc2, 0x00, 0x00 }; | 39 | static unsigned char bridge_ula_lec[] = { 0x01, 0x80, 0xc2, 0x00, 0x00 }; |
@@ -271,7 +270,8 @@ static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
271 | printk("%s:No lecd attached\n", dev->name); | 270 | printk("%s:No lecd attached\n", dev->name); |
272 | dev->stats.tx_errors++; | 271 | dev->stats.tx_errors++; |
273 | netif_stop_queue(dev); | 272 | netif_stop_queue(dev); |
274 | return -EUNATCH; | 273 | kfree_skb(skb); |
274 | return NETDEV_TX_OK; | ||
275 | } | 275 | } |
276 | 276 | ||
277 | pr_debug("skbuff head:%lx data:%lx tail:%lx end:%lx\n", | 277 | pr_debug("skbuff head:%lx data:%lx tail:%lx end:%lx\n", |
@@ -518,18 +518,14 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
518 | case l_should_bridge: | 518 | case l_should_bridge: |
519 | #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) | 519 | #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) |
520 | { | 520 | { |
521 | struct net_bridge_fdb_entry *f; | ||
522 | |||
523 | pr_debug("%s: bridge zeppelin asks about %pM\n", | 521 | pr_debug("%s: bridge zeppelin asks about %pM\n", |
524 | dev->name, mesg->content.proxy.mac_addr); | 522 | dev->name, mesg->content.proxy.mac_addr); |
525 | 523 | ||
526 | if (br_fdb_get_hook == NULL || dev->br_port == NULL) | 524 | if (br_fdb_test_addr_hook == NULL) |
527 | break; | 525 | break; |
528 | 526 | ||
529 | f = br_fdb_get_hook(dev->br_port->br, | 527 | if (br_fdb_test_addr_hook(dev, |
530 | mesg->content.proxy.mac_addr); | 528 | mesg->content.proxy.mac_addr)) { |
531 | if (f != NULL && f->dst->dev != dev | ||
532 | && f->dst->state == BR_STATE_FORWARDING) { | ||
533 | /* hit from bridge table, send LE_ARP_RESPONSE */ | 529 | /* hit from bridge table, send LE_ARP_RESPONSE */ |
534 | struct sk_buff *skb2; | 530 | struct sk_buff *skb2; |
535 | struct sock *sk; | 531 | struct sock *sk; |
@@ -540,10 +536,8 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
540 | skb2 = | 536 | skb2 = |
541 | alloc_skb(sizeof(struct atmlec_msg), | 537 | alloc_skb(sizeof(struct atmlec_msg), |
542 | GFP_ATOMIC); | 538 | GFP_ATOMIC); |
543 | if (skb2 == NULL) { | 539 | if (skb2 == NULL) |
544 | br_fdb_put_hook(f); | ||
545 | break; | 540 | break; |
546 | } | ||
547 | skb2->len = sizeof(struct atmlec_msg); | 541 | skb2->len = sizeof(struct atmlec_msg); |
548 | skb_copy_to_linear_data(skb2, mesg, | 542 | skb_copy_to_linear_data(skb2, mesg, |
549 | sizeof(*mesg)); | 543 | sizeof(*mesg)); |
@@ -552,8 +546,6 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
552 | skb_queue_tail(&sk->sk_receive_queue, skb2); | 546 | skb_queue_tail(&sk->sk_receive_queue, skb2); |
553 | sk->sk_data_ready(sk, skb2->len); | 547 | sk->sk_data_ready(sk, skb2->len); |
554 | } | 548 | } |
555 | if (f != NULL) | ||
556 | br_fdb_put_hook(f); | ||
557 | } | 549 | } |
558 | #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */ | 550 | #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */ |
559 | break; | 551 | break; |