aboutsummaryrefslogtreecommitdiffstats
path: root/net/atm/lec.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/atm/lec.c')
-rw-r--r--net/atm/lec.c20
1 files changed, 6 insertions, 14 deletions
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
40static unsigned char bridge_ula_lec[] = { 0x01, 0x80, 0xc2, 0x00, 0x00 }; 39static 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;