2 * lec.c: Lan Emulation driver
3 * Marko Kiiskila mkiiskila@yahoo.com
7 #include <linux/kernel.h>
8 #include <linux/bitops.h>
9 #include <linux/capability.h>
11 /* We are ethernet device */
12 #include <linux/if_ether.h>
13 #include <linux/netdevice.h>
14 #include <linux/etherdevice.h>
16 #include <linux/skbuff.h>
18 #include <asm/byteorder.h>
19 #include <asm/uaccess.h>
22 #include <linux/proc_fs.h>
23 #include <linux/spinlock.h>
24 #include <linux/proc_fs.h>
25 #include <linux/seq_file.h>
27 /* TokenRing if needed */
29 #include <linux/trdevice.h>
33 #include <linux/atmdev.h>
34 #include <linux/atmlec.h>
36 /* Proxy LEC knows about bridging */
37 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
38 #include <linux/if_bridge.h>
39 #include "../bridge/br_private.h"
41 static unsigned char bridge_ula_lec[] = {0x01, 0x80, 0xc2, 0x00, 0x00};
45 #include <linux/module.h>
46 #include <linux/init.h>
50 #include "resources.h"
53 #define DPRINTK printk
55 #define DPRINTK(format,args...)
58 #define DUMP_PACKETS 0 /* 0 = None,
63 #define LEC_UNRES_QUE_LEN 8 /* number of tx packets to queue for a
64 single destination while waiting for SVC */
66 static int lec_open(struct net_device *dev);
67 static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev);
68 static int lec_close(struct net_device *dev);
69 static struct net_device_stats *lec_get_stats(struct net_device *dev);
70 static void lec_init(struct net_device *dev);
71 static struct lec_arp_table* lec_arp_find(struct lec_priv *priv,
72 unsigned char *mac_addr);
73 static int lec_arp_remove(struct lec_priv *priv,
74 struct lec_arp_table *to_remove);
76 static void lane2_associate_ind (struct net_device *dev, u8 *mac_address,
77 u8 *tlvs, u32 sizeoftlvs);
78 static int lane2_resolve(struct net_device *dev, u8 *dst_mac, int force,
79 u8 **tlvs, u32 *sizeoftlvs);
80 static int lane2_associate_req (struct net_device *dev, u8 *lan_dst,
81 u8 *tlvs, u32 sizeoftlvs);
83 static int lec_addr_delete(struct lec_priv *priv, unsigned char *atm_addr,
84 unsigned long permanent);
85 static void lec_arp_check_empties(struct lec_priv *priv,
86 struct atm_vcc *vcc, struct sk_buff *skb);
87 static void lec_arp_destroy(struct lec_priv *priv);
88 static void lec_arp_init(struct lec_priv *priv);
89 static struct atm_vcc* lec_arp_resolve(struct lec_priv *priv,
90 unsigned char *mac_to_find,
92 struct lec_arp_table **ret_entry);
93 static void lec_arp_update(struct lec_priv *priv, unsigned char *mac_addr,
94 unsigned char *atm_addr, unsigned long remoteflag,
95 unsigned int targetless_le_arp);
96 static void lec_flush_complete(struct lec_priv *priv, unsigned long tran_id);
97 static int lec_mcast_make(struct lec_priv *priv, struct atm_vcc *vcc);
98 static void lec_set_flush_tran_id(struct lec_priv *priv,
99 unsigned char *atm_addr,
100 unsigned long tran_id);
101 static void lec_vcc_added(struct lec_priv *priv, struct atmlec_ioc *ioc_data,
103 void (*old_push)(struct atm_vcc *vcc, struct sk_buff *skb));
104 static void lec_vcc_close(struct lec_priv *priv, struct atm_vcc *vcc);
106 static struct lane2_ops lane2_ops = {
107 lane2_resolve, /* resolve, spec 3.1.3 */
108 lane2_associate_req, /* associate_req, spec 3.1.4 */
109 NULL /* associate indicator, spec 3.1.5 */
112 static unsigned char bus_mac[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
114 /* Device structures */
115 static struct net_device *dev_lec[MAX_LEC_ITF];
117 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
118 static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev)
122 struct lec_priv *priv;
124 /* Check if this is a BPDU. If so, ask zeppelin to send
125 * LE_TOPOLOGY_REQUEST with the same value of Topology Change bit
126 * as the Config BPDU has */
127 eth = (struct ethhdr *)skb->data;
128 buff = skb->data + skb->dev->hard_header_len;
129 if (*buff++ == 0x42 && *buff++ == 0x42 && *buff++ == 0x03) {
131 struct sk_buff *skb2;
132 struct atmlec_msg *mesg;
134 skb2 = alloc_skb(sizeof(struct atmlec_msg), GFP_ATOMIC);
135 if (skb2 == NULL) return;
136 skb2->len = sizeof(struct atmlec_msg);
137 mesg = (struct atmlec_msg *)skb2->data;
138 mesg->type = l_topology_change;
140 mesg->content.normal.flag = *buff & 0x01; /* 0x01 is topology change */
142 priv = (struct lec_priv *)dev->priv;
143 atm_force_charge(priv->lecd, skb2->truesize);
144 sk = sk_atm(priv->lecd);
145 skb_queue_tail(&sk->sk_receive_queue, skb2);
146 sk->sk_data_ready(sk, skb2->len);
151 #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */
154 * Modelled after tr_type_trans
155 * All multicast and ARE or STE frames go to BUS.
156 * Non source routed frames go by destination address.
157 * Last hop source routed frames go by destination address.
158 * Not last hop source routed frames go by _next_ route descriptor.
159 * Returns pointer to destination MAC address or fills in rdesc
163 static unsigned char *get_tr_dst(unsigned char *packet, unsigned char *rdesc)
166 int riflen, num_rdsc;
168 trh = (struct trh_hdr *)packet;
169 if (trh->daddr[0] & (uint8_t)0x80)
170 return bus_mac; /* multicast */
172 if (trh->saddr[0] & TR_RII) {
173 riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
174 if ((ntohs(trh->rcf) >> 13) != 0)
175 return bus_mac; /* ARE or STE */
178 return trh->daddr; /* not source routed */
181 return trh->daddr; /* last hop, source routed */
183 /* riflen is 6 or more, packet has more than one route descriptor */
184 num_rdsc = (riflen/2) - 1;
185 memset(rdesc, 0, ETH_ALEN);
186 /* offset 4 comes from LAN destination field in LE control frames */
187 if (trh->rcf & htons((uint16_t)TR_RCF_DIR_BIT))
188 memcpy(&rdesc[4], &trh->rseg[num_rdsc-2], sizeof(uint16_t));
190 memcpy(&rdesc[4], &trh->rseg[1], sizeof(uint16_t));
191 rdesc[5] = ((ntohs(trh->rseg[0]) & 0x000f) | (rdesc[5] & 0xf0));
196 #endif /* CONFIG_TR */
199 * Open/initialize the netdevice. This is called (in the current kernel)
200 * sometime after booting when the 'ifconfig' program is run.
202 * This routine should set everything up anew at each open, even
203 * registers that "should" only need to be set once at boot, so that
204 * there is non-reboot way to recover if something goes wrong.
208 lec_open(struct net_device *dev)
210 struct lec_priv *priv = (struct lec_priv *)dev->priv;
212 netif_start_queue(dev);
213 memset(&priv->stats,0,sizeof(struct net_device_stats));
218 static __inline__ void
219 lec_send(struct atm_vcc *vcc, struct sk_buff *skb, struct lec_priv *priv)
221 ATM_SKB(skb)->vcc = vcc;
222 ATM_SKB(skb)->atm_options = vcc->atm_options;
224 atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc);
225 if (vcc->send(vcc, skb) < 0) {
226 priv->stats.tx_dropped++;
230 priv->stats.tx_packets++;
231 priv->stats.tx_bytes += skb->len;
235 lec_tx_timeout(struct net_device *dev)
237 printk(KERN_INFO "%s: tx timeout\n", dev->name);
238 dev->trans_start = jiffies;
239 netif_wake_queue(dev);
243 lec_start_xmit(struct sk_buff *skb, struct net_device *dev)
245 struct sk_buff *skb2;
246 struct lec_priv *priv = (struct lec_priv *)dev->priv;
247 struct lecdatahdr_8023 *lec_h;
249 struct lec_arp_table *entry;
253 unsigned char rdesc[ETH_ALEN]; /* Token Ring route descriptor */
259 #endif /* DUMP_PACKETS >0 */
261 DPRINTK("lec_start_xmit called\n");
263 printk("%s:No lecd attached\n",dev->name);
264 priv->stats.tx_errors++;
265 netif_stop_queue(dev);
269 DPRINTK("skbuff head:%lx data:%lx tail:%lx end:%lx\n",
270 (long)skb->head, (long)skb->data, (long)skb->tail,
272 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
273 if (memcmp(skb->data, bridge_ula_lec, sizeof(bridge_ula_lec)) == 0)
274 lec_handle_bridge(skb, dev);
277 /* Make sure we have room for lec_id */
278 if (skb_headroom(skb) < 2) {
280 DPRINTK("lec_start_xmit: reallocating skb\n");
281 skb2 = skb_realloc_headroom(skb, LEC_HEADER_LEN);
283 if (skb2 == NULL) return 0;
288 /* Put le header to place, works for TokenRing too */
289 lec_h = (struct lecdatahdr_8023*)skb->data;
290 lec_h->le_header = htons(priv->lecid);
293 /* Ugly. Use this to realign Token Ring packets for
294 * e.g. PCA-200E driver. */
295 if (priv->is_trdev) {
296 skb2 = skb_realloc_headroom(skb, LEC_HEADER_LEN);
298 if (skb2 == NULL) return 0;
304 printk("%s: send datalen:%ld lecid:%4.4x\n", dev->name,
305 skb->len, priv->lecid);
306 #if DUMP_PACKETS >= 2
307 for(i=0;i<skb->len && i <99;i++) {
308 sprintf(buf+i*3,"%2.2x ",0xff&skb->data[i]);
310 #elif DUMP_PACKETS >= 1
311 for(i=0;i<skb->len && i < 30;i++) {
312 sprintf(buf+i*3,"%2.2x ", 0xff&skb->data[i]);
314 #endif /* DUMP_PACKETS >= 1 */
318 printk("%s...\n",buf);
319 #endif /* DUMP_PACKETS > 0 */
321 /* Minimum ethernet-frame size */
324 min_frame_size = LEC_MINIMUM_8025_SIZE;
327 min_frame_size = LEC_MINIMUM_8023_SIZE;
328 if (skb->len < min_frame_size) {
329 if ((skb->len + skb_tailroom(skb)) < min_frame_size) {
330 skb2 = skb_copy_expand(skb, 0,
331 min_frame_size - skb->truesize, GFP_ATOMIC);
334 priv->stats.tx_dropped++;
339 skb_put(skb, min_frame_size - skb->len);
342 /* Send to right vcc */
346 if (priv->is_trdev) {
347 dst = get_tr_dst(skb->data+2, rdesc);
355 vcc = lec_arp_resolve(priv, dst, is_rdesc, &entry);
356 DPRINTK("%s:vcc:%p vcc_flags:%x, entry:%p\n", dev->name,
357 vcc, vcc?vcc->flags:0, entry);
358 if (!vcc || !test_bit(ATM_VF_READY,&vcc->flags)) {
359 if (entry && (entry->tx_wait.qlen < LEC_UNRES_QUE_LEN)) {
360 DPRINTK("%s:lec_start_xmit: queuing packet, ", dev->name);
361 DPRINTK("MAC address 0x%02x:%02x:%02x:%02x:%02x:%02x\n",
362 lec_h->h_dest[0], lec_h->h_dest[1], lec_h->h_dest[2],
363 lec_h->h_dest[3], lec_h->h_dest[4], lec_h->h_dest[5]);
364 skb_queue_tail(&entry->tx_wait, skb);
366 DPRINTK("%s:lec_start_xmit: tx queue full or no arp entry, dropping, ", dev->name);
367 DPRINTK("MAC address 0x%02x:%02x:%02x:%02x:%02x:%02x\n",
368 lec_h->h_dest[0], lec_h->h_dest[1], lec_h->h_dest[2],
369 lec_h->h_dest[3], lec_h->h_dest[4], lec_h->h_dest[5]);
370 priv->stats.tx_dropped++;
377 printk("%s:sending to vpi:%d vci:%d\n", dev->name,
379 #endif /* DUMP_PACKETS > 0 */
381 while (entry && (skb2 = skb_dequeue(&entry->tx_wait))) {
382 DPRINTK("lec.c: emptying tx queue, ");
383 DPRINTK("MAC address 0x%02x:%02x:%02x:%02x:%02x:%02x\n",
384 lec_h->h_dest[0], lec_h->h_dest[1], lec_h->h_dest[2],
385 lec_h->h_dest[3], lec_h->h_dest[4], lec_h->h_dest[5]);
386 lec_send(vcc, skb2, priv);
389 lec_send(vcc, skb, priv);
391 if (!atm_may_send(vcc, 0)) {
392 struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc);
395 netif_stop_queue(dev);
398 * vcc->pop() might have occurred in between, making
399 * the vcc usuable again. Since xmit is serialized,
400 * this is the only situation we have to re-test.
403 if (atm_may_send(vcc, 0))
404 netif_wake_queue(dev);
407 dev->trans_start = jiffies;
411 /* The inverse routine to net_open(). */
413 lec_close(struct net_device *dev)
415 netif_stop_queue(dev);
420 * Get the current statistics.
421 * This may be called with the card open or closed.
423 static struct net_device_stats *
424 lec_get_stats(struct net_device *dev)
426 return &((struct lec_priv *)dev->priv)->stats;
430 lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb)
433 struct net_device *dev = (struct net_device*)vcc->proto_data;
434 struct lec_priv *priv = (struct lec_priv*)dev->priv;
435 struct atmlec_msg *mesg;
436 struct lec_arp_table *entry;
438 char *tmp; /* FIXME */
440 atomic_sub(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc);
441 mesg = (struct atmlec_msg *)skb->data;
443 tmp += sizeof(struct atmlec_msg);
444 DPRINTK("%s: msg from zeppelin:%d\n", dev->name, mesg->type);
448 dev->dev_addr[i] = mesg->content.normal.mac_addr[i];
453 dev->dev_addr[i] = 0;
457 lec_addr_delete(priv, mesg->content.normal.atm_addr,
458 mesg->content.normal.flag);
460 case l_topology_change:
461 priv->topology_change = mesg->content.normal.flag;
463 case l_flush_complete:
464 lec_flush_complete(priv, mesg->content.normal.flag);
466 case l_narp_req: /* LANE2: see 7.1.35 in the lane2 spec */
467 spin_lock_irqsave(&priv->lec_arp_lock, flags);
468 entry = lec_arp_find(priv, mesg->content.normal.mac_addr);
469 lec_arp_remove(priv, entry);
470 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
472 if (mesg->content.normal.no_source_le_narp)
476 lec_arp_update(priv, mesg->content.normal.mac_addr,
477 mesg->content.normal.atm_addr,
478 mesg->content.normal.flag,
479 mesg->content.normal.targetless_le_arp);
480 DPRINTK("lec: in l_arp_update\n");
481 if (mesg->sizeoftlvs != 0) { /* LANE2 3.1.5 */
482 DPRINTK("lec: LANE2 3.1.5, got tlvs, size %d\n", mesg->sizeoftlvs);
483 lane2_associate_ind(dev,
484 mesg->content.normal.mac_addr,
485 tmp, mesg->sizeoftlvs);
489 priv->maximum_unknown_frame_count =
490 mesg->content.config.maximum_unknown_frame_count;
491 priv->max_unknown_frame_time =
492 (mesg->content.config.max_unknown_frame_time*HZ);
493 priv->max_retry_count =
494 mesg->content.config.max_retry_count;
495 priv->aging_time = (mesg->content.config.aging_time*HZ);
496 priv->forward_delay_time =
497 (mesg->content.config.forward_delay_time*HZ);
498 priv->arp_response_time =
499 (mesg->content.config.arp_response_time*HZ);
500 priv->flush_timeout = (mesg->content.config.flush_timeout*HZ);
501 priv->path_switching_delay =
502 (mesg->content.config.path_switching_delay*HZ);
503 priv->lane_version = mesg->content.config.lane_version; /* LANE2 */
504 priv->lane2_ops = NULL;
505 if (priv->lane_version > 1)
506 priv->lane2_ops = &lane2_ops;
507 if (dev->change_mtu(dev, mesg->content.config.mtu))
508 printk("%s: change_mtu to %d failed\n", dev->name,
509 mesg->content.config.mtu);
510 priv->is_proxy = mesg->content.config.is_proxy;
512 case l_flush_tran_id:
513 lec_set_flush_tran_id(priv, mesg->content.normal.atm_addr,
514 mesg->content.normal.flag);
517 priv->lecid=(unsigned short)(0xffff&mesg->content.normal.flag);
519 case l_should_bridge: {
520 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
521 struct net_bridge_fdb_entry *f;
523 DPRINTK("%s: bridge zeppelin asks about 0x%02x:%02x:%02x:%02x:%02x:%02x\n",
525 mesg->content.proxy.mac_addr[0], mesg->content.proxy.mac_addr[1],
526 mesg->content.proxy.mac_addr[2], mesg->content.proxy.mac_addr[3],
527 mesg->content.proxy.mac_addr[4], mesg->content.proxy.mac_addr[5]);
529 if (br_fdb_get_hook == NULL || dev->br_port == NULL)
532 f = br_fdb_get_hook(dev->br_port->br, mesg->content.proxy.mac_addr);
534 f->dst->dev != dev &&
535 f->dst->state == BR_STATE_FORWARDING) {
536 /* hit from bridge table, send LE_ARP_RESPONSE */
537 struct sk_buff *skb2;
540 DPRINTK("%s: entry found, responding to zeppelin\n", dev->name);
541 skb2 = alloc_skb(sizeof(struct atmlec_msg), GFP_ATOMIC);
546 skb2->len = sizeof(struct atmlec_msg);
547 memcpy(skb2->data, mesg, sizeof(struct atmlec_msg));
548 atm_force_charge(priv->lecd, skb2->truesize);
549 sk = sk_atm(priv->lecd);
550 skb_queue_tail(&sk->sk_receive_queue, skb2);
551 sk->sk_data_ready(sk, skb2->len);
553 if (f != NULL) br_fdb_put_hook(f);
554 #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */
558 printk("%s: Unknown message type %d\n", dev->name, mesg->type);
567 lec_atm_close(struct atm_vcc *vcc)
570 struct net_device *dev = (struct net_device *)vcc->proto_data;
571 struct lec_priv *priv = (struct lec_priv *)dev->priv;
574 /* Do something needful? */
576 netif_stop_queue(dev);
577 lec_arp_destroy(priv);
579 if (skb_peek(&sk_atm(vcc)->sk_receive_queue))
580 printk("%s lec_atm_close: closing with messages pending\n",
582 while ((skb = skb_dequeue(&sk_atm(vcc)->sk_receive_queue)) != NULL) {
583 atm_return(vcc, skb->truesize);
587 printk("%s: Shut down!\n", dev->name);
588 module_put(THIS_MODULE);
591 static struct atmdev_ops lecdev_ops = {
592 .close = lec_atm_close,
596 static struct atm_dev lecatm_dev = {
599 .number = 999, /* dummy device number */
600 .lock = SPIN_LOCK_UNLOCKED
604 * LANE2: new argument struct sk_buff *data contains
605 * the LE_ARP based TLVs introduced in the LANE2 spec
608 send_to_lecd(struct lec_priv *priv, atmlec_msg_type type,
609 unsigned char *mac_addr, unsigned char *atm_addr,
610 struct sk_buff *data)
614 struct atmlec_msg *mesg;
616 if (!priv || !priv->lecd) {
619 skb = alloc_skb(sizeof(struct atmlec_msg), GFP_ATOMIC);
622 skb->len = sizeof(struct atmlec_msg);
623 mesg = (struct atmlec_msg *)skb->data;
624 memset(mesg, 0, sizeof(struct atmlec_msg));
627 mesg->sizeoftlvs = data->len;
629 memcpy(&mesg->content.normal.mac_addr, mac_addr, ETH_ALEN);
631 mesg->content.normal.targetless_le_arp = 1;
633 memcpy(&mesg->content.normal.atm_addr, atm_addr, ATM_ESA_LEN);
635 atm_force_charge(priv->lecd, skb->truesize);
636 sk = sk_atm(priv->lecd);
637 skb_queue_tail(&sk->sk_receive_queue, skb);
638 sk->sk_data_ready(sk, skb->len);
641 DPRINTK("lec: about to send %d bytes of data\n", data->len);
642 atm_force_charge(priv->lecd, data->truesize);
643 skb_queue_tail(&sk->sk_receive_queue, data);
644 sk->sk_data_ready(sk, skb->len);
650 /* shamelessly stolen from drivers/net/net_init.c */
651 static int lec_change_mtu(struct net_device *dev, int new_mtu)
653 if ((new_mtu < 68) || (new_mtu > 18190))
659 static void lec_set_multicast_list(struct net_device *dev)
661 /* by default, all multicast frames arrive over the bus.
662 * eventually support selective multicast service
668 lec_init(struct net_device *dev)
670 dev->change_mtu = lec_change_mtu;
671 dev->open = lec_open;
672 dev->stop = lec_close;
673 dev->hard_start_xmit = lec_start_xmit;
674 dev->tx_timeout = lec_tx_timeout;
676 dev->get_stats = lec_get_stats;
677 dev->set_multicast_list = lec_set_multicast_list;
678 dev->do_ioctl = NULL;
679 printk("%s: Initialized!\n",dev->name);
683 static unsigned char lec_ctrl_magic[] = {
689 #define LEC_DATA_DIRECT_8023 2
690 #define LEC_DATA_DIRECT_8025 3
692 static int lec_is_data_direct(struct atm_vcc *vcc)
694 return ((vcc->sap.blli[0].l3.tr9577.snap[4] == LEC_DATA_DIRECT_8023) ||
695 (vcc->sap.blli[0].l3.tr9577.snap[4] == LEC_DATA_DIRECT_8025));
699 lec_push(struct atm_vcc *vcc, struct sk_buff *skb)
702 struct net_device *dev = (struct net_device *)vcc->proto_data;
703 struct lec_priv *priv = (struct lec_priv *)dev->priv;
709 printk("%s: lec_push vcc vpi:%d vci:%d\n", dev->name,
713 DPRINTK("%s: null skb\n",dev->name);
714 lec_vcc_close(priv, vcc);
718 printk("%s: rcv datalen:%ld lecid:%4.4x\n", dev->name,
719 skb->len, priv->lecid);
720 #if DUMP_PACKETS >= 2
721 for(i=0;i<skb->len && i <99;i++) {
722 sprintf(buf+i*3,"%2.2x ",0xff&skb->data[i]);
724 #elif DUMP_PACKETS >= 1
725 for(i=0;i<skb->len && i < 30;i++) {
726 sprintf(buf+i*3,"%2.2x ", 0xff&skb->data[i]);
728 #endif /* DUMP_PACKETS >= 1 */
732 printk("%s...\n",buf);
733 #endif /* DUMP_PACKETS > 0 */
734 if (memcmp(skb->data, lec_ctrl_magic, 4) ==0) { /* Control frame, to daemon*/
735 struct sock *sk = sk_atm(vcc);
737 DPRINTK("%s: To daemon\n",dev->name);
738 skb_queue_tail(&sk->sk_receive_queue, skb);
739 sk->sk_data_ready(sk, skb->len);
740 } else { /* Data frame, queue to protocol handlers */
741 struct lec_arp_table *entry;
742 unsigned char *src, *dst;
744 atm_return(vcc,skb->truesize);
745 if (*(uint16_t *)skb->data == htons(priv->lecid) ||
747 !(dev->flags & IFF_UP)) {
748 /* Probably looping back, or if lecd is missing,
749 lecd has gone down */
750 DPRINTK("Ignoring frame...\n");
756 dst = ((struct lecdatahdr_8025 *) skb->data)->h_dest;
759 dst = ((struct lecdatahdr_8023 *) skb->data)->h_dest;
761 /* If this is a Data Direct VCC, and the VCC does not match
762 * the LE_ARP cache entry, delete the LE_ARP cache entry.
764 spin_lock_irqsave(&priv->lec_arp_lock, flags);
765 if (lec_is_data_direct(vcc)) {
768 src = ((struct lecdatahdr_8025 *) skb->data)->h_source;
771 src = ((struct lecdatahdr_8023 *) skb->data)->h_source;
772 entry = lec_arp_find(priv, src);
773 if (entry && entry->vcc != vcc) {
774 lec_arp_remove(priv, entry);
778 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
780 if (!(dst[0]&0x01) && /* Never filter Multi/Broadcast */
781 !priv->is_proxy && /* Proxy wants all the packets */
782 memcmp(dst, dev->dev_addr, dev->addr_len)) {
786 if (priv->lec_arp_empty_ones) {
787 lec_arp_check_empties(priv, vcc, skb);
790 skb_pull(skb, 2); /* skip lec_id */
792 if (priv->is_trdev) skb->protocol = tr_type_trans(skb, dev);
795 skb->protocol = eth_type_trans(skb, dev);
796 priv->stats.rx_packets++;
797 priv->stats.rx_bytes += skb->len;
798 memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
804 lec_pop(struct atm_vcc *vcc, struct sk_buff *skb)
806 struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc);
807 struct net_device *dev = skb->dev;
810 printk("lec_pop(): vpriv = NULL!?!?!?\n");
814 vpriv->old_pop(vcc, skb);
816 if (vpriv->xoff && atm_may_send(vcc, 0)) {
818 if (netif_running(dev) && netif_queue_stopped(dev))
819 netif_wake_queue(dev);
824 lec_vcc_attach(struct atm_vcc *vcc, void __user *arg)
826 struct lec_vcc_priv *vpriv;
828 struct atmlec_ioc ioc_data;
830 /* Lecd must be up in this case */
831 bytes_left = copy_from_user(&ioc_data, arg, sizeof(struct atmlec_ioc));
832 if (bytes_left != 0) {
833 printk("lec: lec_vcc_attach, copy from user failed for %d bytes\n",
836 if (ioc_data.dev_num < 0 || ioc_data.dev_num >= MAX_LEC_ITF ||
837 !dev_lec[ioc_data.dev_num])
839 if (!(vpriv = kmalloc(sizeof(struct lec_vcc_priv), GFP_KERNEL)))
842 vpriv->old_pop = vcc->pop;
843 vcc->user_back = vpriv;
845 lec_vcc_added(dev_lec[ioc_data.dev_num]->priv,
846 &ioc_data, vcc, vcc->push);
847 vcc->proto_data = dev_lec[ioc_data.dev_num];
848 vcc->push = lec_push;
853 lec_mcast_attach(struct atm_vcc *vcc, int arg)
855 if (arg <0 || arg >= MAX_LEC_ITF || !dev_lec[arg])
857 vcc->proto_data = dev_lec[arg];
858 return (lec_mcast_make((struct lec_priv*)dev_lec[arg]->priv, vcc));
861 /* Initialize device. */
863 lecd_attach(struct atm_vcc *vcc, int arg)
866 struct lec_priv *priv;
873 if (arg >= MAX_LEC_ITF)
875 #else /* Reserve the top NUM_TR_DEVS for TR */
876 if (arg >= (MAX_LEC_ITF-NUM_TR_DEVS))
883 if (i >= (MAX_LEC_ITF - NUM_TR_DEVS))
886 size = sizeof(struct lec_priv);
889 dev_lec[i] = alloc_trdev(size);
892 dev_lec[i] = alloc_etherdev(size);
895 snprintf(dev_lec[i]->name, IFNAMSIZ, "lec%d", i);
896 if (register_netdev(dev_lec[i])) {
897 free_netdev(dev_lec[i]);
901 priv = dev_lec[i]->priv;
902 priv->is_trdev = is_trdev;
903 lec_init(dev_lec[i]);
905 priv = dev_lec[i]->priv;
910 priv->itfnum = i; /* LANE2 addition */
912 vcc->dev = &lecatm_dev;
913 vcc_insert_socket(sk_atm(vcc));
915 vcc->proto_data = dev_lec[i];
916 set_bit(ATM_VF_META,&vcc->flags);
917 set_bit(ATM_VF_READY,&vcc->flags);
919 /* Set default values to these variables */
920 priv->maximum_unknown_frame_count = 1;
921 priv->max_unknown_frame_time = (1*HZ);
922 priv->vcc_timeout_period = (1200*HZ);
923 priv->max_retry_count = 1;
924 priv->aging_time = (300*HZ);
925 priv->forward_delay_time = (15*HZ);
926 priv->topology_change = 0;
927 priv->arp_response_time = (1*HZ);
928 priv->flush_timeout = (4*HZ);
929 priv->path_switching_delay = (6*HZ);
931 if (dev_lec[i]->flags & IFF_UP) {
932 netif_start_queue(dev_lec[i]);
934 __module_get(THIS_MODULE);
938 #ifdef CONFIG_PROC_FS
939 static char* lec_arp_get_status_string(unsigned char status)
941 static char *lec_arp_status_string[] = {
946 "ESI_FLUSH_PENDING ",
950 if (status > ESI_FORWARD_DIRECT)
951 status = 3; /* ESI_UNDEFINED */
952 return lec_arp_status_string[status];
955 static void lec_info(struct seq_file *seq, struct lec_arp_table *entry)
959 for (i = 0; i < ETH_ALEN; i++)
960 seq_printf(seq, "%2.2x", entry->mac_addr[i] & 0xff);
961 seq_printf(seq, " ");
962 for (i = 0; i < ATM_ESA_LEN; i++)
963 seq_printf(seq, "%2.2x", entry->atm_addr[i] & 0xff);
964 seq_printf(seq, " %s %4.4x", lec_arp_get_status_string(entry->status),
965 entry->flags & 0xffff);
967 seq_printf(seq, "%3d %3d ", entry->vcc->vpi, entry->vcc->vci);
969 seq_printf(seq, " ");
970 if (entry->recv_vcc) {
971 seq_printf(seq, " %3d %3d", entry->recv_vcc->vpi,
972 entry->recv_vcc->vci);
980 struct lec_priv *locked;
981 struct lec_arp_table *entry;
982 struct net_device *dev;
988 static void *lec_tbl_walk(struct lec_state *state, struct lec_arp_table *tbl,
991 struct lec_arp_table *e = state->entry;
995 if (e == (void *)1) {
999 for (; e; e = e->next) {
1004 return (*l < 0) ? state : NULL;
1007 static void *lec_arp_walk(struct lec_state *state, loff_t *l,
1008 struct lec_priv *priv)
1013 for (p = state->arp_table; p < LEC_ARP_TABLE_SIZE; p++) {
1014 v = lec_tbl_walk(state, priv->lec_arp_tables[p], l);
1018 state->arp_table = p;
1022 static void *lec_misc_walk(struct lec_state *state, loff_t *l,
1023 struct lec_priv *priv)
1025 struct lec_arp_table *lec_misc_tables[] = {
1026 priv->lec_arp_empty_ones,
1027 priv->lec_no_forward,
1033 for (q = state->misc_table; q < ARRAY_SIZE(lec_misc_tables); q++) {
1034 v = lec_tbl_walk(state, lec_misc_tables[q], l);
1038 state->misc_table = q;
1042 static void *lec_priv_walk(struct lec_state *state, loff_t *l,
1043 struct lec_priv *priv)
1045 if (!state->locked) {
1046 state->locked = priv;
1047 spin_lock_irqsave(&priv->lec_arp_lock, state->flags);
1049 if (!lec_arp_walk(state, l, priv) &&
1050 !lec_misc_walk(state, l, priv)) {
1051 spin_unlock_irqrestore(&priv->lec_arp_lock, state->flags);
1052 state->locked = NULL;
1053 /* Partial state reset for the next time we get called */
1054 state->arp_table = state->misc_table = 0;
1056 return state->locked;
1059 static void *lec_itf_walk(struct lec_state *state, loff_t *l)
1061 struct net_device *dev;
1064 dev = state->dev ? state->dev : dev_lec[state->itf];
1065 v = (dev && dev->priv) ? lec_priv_walk(state, l, dev->priv) : NULL;
1068 /* Partial state reset for the next time we get called */
1075 static void *lec_get_idx(struct lec_state *state, loff_t l)
1079 for (; state->itf < MAX_LEC_ITF; state->itf++) {
1080 v = lec_itf_walk(state, &l);
1087 static void *lec_seq_start(struct seq_file *seq, loff_t *pos)
1089 struct lec_state *state = seq->private;
1093 state->locked = NULL;
1094 state->arp_table = 0;
1095 state->misc_table = 0;
1096 state->entry = (void *)1;
1098 return *pos ? lec_get_idx(state, *pos) : (void*)1;
1101 static void lec_seq_stop(struct seq_file *seq, void *v)
1103 struct lec_state *state = seq->private;
1106 spin_unlock_irqrestore(&state->locked->lec_arp_lock,
1108 dev_put(state->dev);
1112 static void *lec_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1114 struct lec_state *state = seq->private;
1116 v = lec_get_idx(state, 1);
1117 *pos += !!PTR_ERR(v);
1121 static int lec_seq_show(struct seq_file *seq, void *v)
1123 static char lec_banner[] = "Itf MAC ATM destination"
1125 "VPI/VCI Recv VPI/VCI\n";
1128 seq_puts(seq, lec_banner);
1130 struct lec_state *state = seq->private;
1131 struct net_device *dev = state->dev;
1133 seq_printf(seq, "%s ", dev->name);
1134 lec_info(seq, state->entry);
1139 static struct seq_operations lec_seq_ops = {
1140 .start = lec_seq_start,
1141 .next = lec_seq_next,
1142 .stop = lec_seq_stop,
1143 .show = lec_seq_show,
1146 static int lec_seq_open(struct inode *inode, struct file *file)
1148 struct lec_state *state;
1149 struct seq_file *seq;
1152 state = kmalloc(sizeof(*state), GFP_KERNEL);
1158 rc = seq_open(file, &lec_seq_ops);
1161 seq = file->private_data;
1162 seq->private = state;
1171 static int lec_seq_release(struct inode *inode, struct file *file)
1173 return seq_release_private(inode, file);
1176 static struct file_operations lec_seq_fops = {
1177 .owner = THIS_MODULE,
1178 .open = lec_seq_open,
1180 .llseek = seq_lseek,
1181 .release = lec_seq_release,
1185 static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1187 struct atm_vcc *vcc = ATM_SD(sock);
1194 if (!capable(CAP_NET_ADMIN))
1198 return -ENOIOCTLCMD;
1203 err = lecd_attach(vcc, (int) arg);
1205 sock->state = SS_CONNECTED;
1208 err = lec_mcast_attach(vcc, (int) arg);
1211 err = lec_vcc_attach(vcc, (void __user *) arg);
1218 static struct atm_ioctl lane_ioctl_ops = {
1219 .owner = THIS_MODULE,
1220 .ioctl = lane_ioctl,
1223 static int __init lane_module_init(void)
1225 #ifdef CONFIG_PROC_FS
1226 struct proc_dir_entry *p;
1228 p = create_proc_entry("lec", S_IRUGO, atm_proc_root);
1230 p->proc_fops = &lec_seq_fops;
1233 register_atm_ioctl(&lane_ioctl_ops);
1234 printk("lec.c: " __DATE__ " " __TIME__ " initialized\n");
1238 static void __exit lane_module_cleanup(void)
1241 struct lec_priv *priv;
1243 remove_proc_entry("lec", atm_proc_root);
1245 deregister_atm_ioctl(&lane_ioctl_ops);
1247 for (i = 0; i < MAX_LEC_ITF; i++) {
1248 if (dev_lec[i] != NULL) {
1249 priv = (struct lec_priv *)dev_lec[i]->priv;
1250 unregister_netdev(dev_lec[i]);
1251 free_netdev(dev_lec[i]);
1259 module_init(lane_module_init);
1260 module_exit(lane_module_cleanup);
1263 * LANE2: 3.1.3, LE_RESOLVE.request
1264 * Non force allocates memory and fills in *tlvs, fills in *sizeoftlvs.
1265 * If sizeoftlvs == NULL the default TLVs associated with with this
1267 * If dst_mac == NULL, targetless LE_ARP will be sent
1269 static int lane2_resolve(struct net_device *dev, u8 *dst_mac, int force,
1270 u8 **tlvs, u32 *sizeoftlvs)
1272 unsigned long flags;
1273 struct lec_priv *priv = (struct lec_priv *)dev->priv;
1274 struct lec_arp_table *table;
1275 struct sk_buff *skb;
1279 spin_lock_irqsave(&priv->lec_arp_lock, flags);
1280 table = lec_arp_find(priv, dst_mac);
1281 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
1285 *tlvs = kmalloc(table->sizeoftlvs, GFP_ATOMIC);
1289 memcpy(*tlvs, table->tlvs, table->sizeoftlvs);
1290 *sizeoftlvs = table->sizeoftlvs;
1295 if (sizeoftlvs == NULL)
1296 retval = send_to_lecd(priv, l_arp_xmt, dst_mac, NULL, NULL);
1299 skb = alloc_skb(*sizeoftlvs, GFP_ATOMIC);
1302 skb->len = *sizeoftlvs;
1303 memcpy(skb->data, *tlvs, *sizeoftlvs);
1304 retval = send_to_lecd(priv, l_arp_xmt, dst_mac, NULL, skb);
1311 * LANE2: 3.1.4, LE_ASSOCIATE.request
1312 * Associate the *tlvs with the *lan_dst address.
1313 * Will overwrite any previous association
1314 * Returns 1 for success, 0 for failure (out of memory)
1317 static int lane2_associate_req (struct net_device *dev, u8 *lan_dst,
1318 u8 *tlvs, u32 sizeoftlvs)
1321 struct sk_buff *skb;
1322 struct lec_priv *priv = (struct lec_priv*)dev->priv;
1324 if (compare_ether_addr(lan_dst, dev->dev_addr))
1325 return (0); /* not our mac address */
1327 kfree(priv->tlvs); /* NULL if there was no previous association */
1329 priv->tlvs = kmalloc(sizeoftlvs, GFP_KERNEL);
1330 if (priv->tlvs == NULL)
1332 priv->sizeoftlvs = sizeoftlvs;
1333 memcpy(priv->tlvs, tlvs, sizeoftlvs);
1335 skb = alloc_skb(sizeoftlvs, GFP_ATOMIC);
1338 skb->len = sizeoftlvs;
1339 memcpy(skb->data, tlvs, sizeoftlvs);
1340 retval = send_to_lecd(priv, l_associate_req, NULL, NULL, skb);
1342 printk("lec.c: lane2_associate_req() failed\n");
1343 /* If the previous association has changed we must
1344 * somehow notify other LANE entities about the change
1350 * LANE2: 3.1.5, LE_ASSOCIATE.indication
1353 static void lane2_associate_ind (struct net_device *dev, u8 *mac_addr,
1354 u8 *tlvs, u32 sizeoftlvs)
1359 struct lec_priv *priv = (struct lec_priv *)dev->priv;
1360 #if 0 /* Why have the TLVs in LE_ARP entries since we do not use them? When you
1361 uncomment this code, make sure the TLVs get freed when entry is killed */
1362 struct lec_arp_table *entry = lec_arp_find(priv, mac_addr);
1365 return; /* should not happen */
1369 entry->tlvs = kmalloc(sizeoftlvs, GFP_KERNEL);
1370 if (entry->tlvs == NULL)
1373 entry->sizeoftlvs = sizeoftlvs;
1374 memcpy(entry->tlvs, tlvs, sizeoftlvs);
1377 printk("lec.c: lane2_associate_ind()\n");
1378 printk("dump of tlvs, sizeoftlvs=%d\n", sizeoftlvs);
1379 while (i < sizeoftlvs)
1380 printk("%02x ", tlvs[i++]);
1385 /* tell MPOA about the TLVs we saw */
1386 if (priv->lane2_ops && priv->lane2_ops->associate_indicator) {
1387 priv->lane2_ops->associate_indicator(dev, mac_addr,
1394 * Here starts what used to lec_arpc.c
1396 * lec_arpc.c was added here when making
1397 * lane client modular. October 1997
1401 #include <linux/types.h>
1402 #include <linux/sched.h>
1403 #include <linux/timer.h>
1404 #include <asm/param.h>
1405 #include <asm/atomic.h>
1406 #include <linux/inetdevice.h>
1407 #include <net/route.h>
1411 #define DPRINTK(format,args...)
1413 #define DPRINTK printk
1416 #define DEBUG_ARP_TABLE 0
1418 #define LEC_ARP_REFRESH_INTERVAL (3*HZ)
1420 static void lec_arp_check_expire(unsigned long data);
1421 static void lec_arp_expire_arp(unsigned long data);
1427 #define HASH(ch) (ch & (LEC_ARP_TABLE_SIZE -1))
1430 * Initialization of arp-cache
1433 lec_arp_init(struct lec_priv *priv)
1437 for (i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
1438 priv->lec_arp_tables[i] = NULL;
1440 spin_lock_init(&priv->lec_arp_lock);
1441 init_timer(&priv->lec_arp_timer);
1442 priv->lec_arp_timer.expires = jiffies + LEC_ARP_REFRESH_INTERVAL;
1443 priv->lec_arp_timer.data = (unsigned long)priv;
1444 priv->lec_arp_timer.function = lec_arp_check_expire;
1445 add_timer(&priv->lec_arp_timer);
1449 lec_arp_clear_vccs(struct lec_arp_table *entry)
1452 struct atm_vcc *vcc = entry->vcc;
1453 struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc);
1454 struct net_device *dev = (struct net_device*) vcc->proto_data;
1456 vcc->pop = vpriv->old_pop;
1458 netif_wake_queue(dev);
1460 vcc->user_back = NULL;
1461 vcc->push = entry->old_push;
1462 vcc_release_async(vcc, -EPIPE);
1465 if (entry->recv_vcc) {
1466 entry->recv_vcc->push = entry->old_recv_push;
1467 vcc_release_async(entry->recv_vcc, -EPIPE);
1468 entry->recv_vcc = NULL;
1473 * Insert entry to lec_arp_table
1474 * LANE2: Add to the end of the list to satisfy 8.1.13
1477 lec_arp_add(struct lec_priv *priv, struct lec_arp_table *to_add)
1479 unsigned short place;
1480 struct lec_arp_table *tmp;
1482 place = HASH(to_add->mac_addr[ETH_ALEN-1]);
1483 tmp = priv->lec_arp_tables[place];
1484 to_add->next = NULL;
1486 priv->lec_arp_tables[place] = to_add;
1488 else { /* add to the end */
1494 DPRINTK("LEC_ARP: Added entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
1495 0xff&to_add->mac_addr[0], 0xff&to_add->mac_addr[1],
1496 0xff&to_add->mac_addr[2], 0xff&to_add->mac_addr[3],
1497 0xff&to_add->mac_addr[4], 0xff&to_add->mac_addr[5]);
1501 * Remove entry from lec_arp_table
1504 lec_arp_remove(struct lec_priv *priv,
1505 struct lec_arp_table *to_remove)
1507 unsigned short place;
1508 struct lec_arp_table *tmp;
1514 place = HASH(to_remove->mac_addr[ETH_ALEN-1]);
1515 tmp = priv->lec_arp_tables[place];
1516 if (tmp == to_remove) {
1517 priv->lec_arp_tables[place] = tmp->next;
1519 while(tmp && tmp->next != to_remove) {
1522 if (!tmp) {/* Entry was not found */
1526 tmp->next = to_remove->next;
1527 del_timer(&to_remove->timer);
1529 /* If this is the only MAC connected to this VCC, also tear down
1531 if (to_remove->status >= ESI_FLUSH_PENDING) {
1533 * ESI_FLUSH_PENDING, ESI_FORWARD_DIRECT
1535 for(place = 0; place < LEC_ARP_TABLE_SIZE; place++) {
1536 for(tmp = priv->lec_arp_tables[place]; tmp != NULL; tmp = tmp->next) {
1537 if (memcmp(tmp->atm_addr, to_remove->atm_addr,
1545 lec_arp_clear_vccs(to_remove);
1547 skb_queue_purge(&to_remove->tx_wait); /* FIXME: good place for this? */
1549 DPRINTK("LEC_ARP: Removed entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
1550 0xff&to_remove->mac_addr[0], 0xff&to_remove->mac_addr[1],
1551 0xff&to_remove->mac_addr[2], 0xff&to_remove->mac_addr[3],
1552 0xff&to_remove->mac_addr[4], 0xff&to_remove->mac_addr[5]);
1558 get_status_string(unsigned char st)
1562 return "ESI_UNKNOWN";
1563 case ESI_ARP_PENDING:
1564 return "ESI_ARP_PENDING";
1565 case ESI_VC_PENDING:
1566 return "ESI_VC_PENDING";
1567 case ESI_FLUSH_PENDING:
1568 return "ESI_FLUSH_PENDING";
1569 case ESI_FORWARD_DIRECT:
1570 return "ESI_FORWARD_DIRECT";
1578 dump_arp_table(struct lec_priv *priv)
1582 struct lec_arp_table *rulla;
1584 struct lec_arp_table **lec_arp_tables =
1585 (struct lec_arp_table **)priv->lec_arp_tables;
1586 struct lec_arp_table *lec_arp_empty_ones =
1587 (struct lec_arp_table *)priv->lec_arp_empty_ones;
1588 struct lec_arp_table *lec_no_forward =
1589 (struct lec_arp_table *)priv->lec_no_forward;
1590 struct lec_arp_table *mcast_fwds = priv->mcast_fwds;
1593 printk("Dump %p:\n",priv);
1594 for (i=0;i<LEC_ARP_TABLE_SIZE;i++) {
1595 rulla = lec_arp_tables[i];
1597 offset += sprintf(buf,"%d: %p\n",i, rulla);
1599 offset += sprintf(buf+offset,"Mac:");
1600 for(j=0;j<ETH_ALEN;j++) {
1601 offset+=sprintf(buf+offset,
1603 rulla->mac_addr[j]&0xff);
1605 offset +=sprintf(buf+offset,"Atm:");
1606 for(j=0;j<ATM_ESA_LEN;j++) {
1607 offset+=sprintf(buf+offset,
1609 rulla->atm_addr[j]&0xff);
1611 offset+=sprintf(buf+offset,
1612 "Vcc vpi:%d vci:%d, Recv_vcc vpi:%d vci:%d Last_used:%lx, Timestamp:%lx, No_tries:%d ",
1613 rulla->vcc?rulla->vcc->vpi:0,
1614 rulla->vcc?rulla->vcc->vci:0,
1615 rulla->recv_vcc?rulla->recv_vcc->vpi:0,
1616 rulla->recv_vcc?rulla->recv_vcc->vci:0,
1618 rulla->timestamp, rulla->no_tries);
1619 offset+=sprintf(buf+offset,
1620 "Flags:%x, Packets_flooded:%x, Status: %s ",
1621 rulla->flags, rulla->packets_flooded,
1622 get_status_string(rulla->status));
1623 offset+=sprintf(buf+offset,"->%p\n",rulla->next);
1624 rulla = rulla->next;
1628 rulla = lec_no_forward;
1630 printk("No forward\n");
1633 offset += sprintf(buf+offset,"Mac:");
1634 for(j=0;j<ETH_ALEN;j++) {
1635 offset+=sprintf(buf+offset,"%2.2x ",
1636 rulla->mac_addr[j]&0xff);
1638 offset +=sprintf(buf+offset,"Atm:");
1639 for(j=0;j<ATM_ESA_LEN;j++) {
1640 offset+=sprintf(buf+offset,"%2.2x ",
1641 rulla->atm_addr[j]&0xff);
1643 offset+=sprintf(buf+offset,
1644 "Vcc vpi:%d vci:%d, Recv_vcc vpi:%d vci:%d Last_used:%lx, Timestamp:%lx, No_tries:%d ",
1645 rulla->vcc?rulla->vcc->vpi:0,
1646 rulla->vcc?rulla->vcc->vci:0,
1647 rulla->recv_vcc?rulla->recv_vcc->vpi:0,
1648 rulla->recv_vcc?rulla->recv_vcc->vci:0,
1650 rulla->timestamp, rulla->no_tries);
1651 offset+=sprintf(buf+offset,
1652 "Flags:%x, Packets_flooded:%x, Status: %s ",
1653 rulla->flags, rulla->packets_flooded,
1654 get_status_string(rulla->status));
1655 offset+=sprintf(buf+offset,"->%lx\n",(long)rulla->next);
1656 rulla = rulla->next;
1659 rulla = lec_arp_empty_ones;
1661 printk("Empty ones\n");
1664 offset += sprintf(buf+offset,"Mac:");
1665 for(j=0;j<ETH_ALEN;j++) {
1666 offset+=sprintf(buf+offset,"%2.2x ",
1667 rulla->mac_addr[j]&0xff);
1669 offset +=sprintf(buf+offset,"Atm:");
1670 for(j=0;j<ATM_ESA_LEN;j++) {
1671 offset+=sprintf(buf+offset,"%2.2x ",
1672 rulla->atm_addr[j]&0xff);
1674 offset+=sprintf(buf+offset,
1675 "Vcc vpi:%d vci:%d, Recv_vcc vpi:%d vci:%d Last_used:%lx, Timestamp:%lx, No_tries:%d ",
1676 rulla->vcc?rulla->vcc->vpi:0,
1677 rulla->vcc?rulla->vcc->vci:0,
1678 rulla->recv_vcc?rulla->recv_vcc->vpi:0,
1679 rulla->recv_vcc?rulla->recv_vcc->vci:0,
1681 rulla->timestamp, rulla->no_tries);
1682 offset+=sprintf(buf+offset,
1683 "Flags:%x, Packets_flooded:%x, Status: %s ",
1684 rulla->flags, rulla->packets_flooded,
1685 get_status_string(rulla->status));
1686 offset+=sprintf(buf+offset,"->%lx\n",(long)rulla->next);
1687 rulla = rulla->next;
1693 printk("Multicast Forward VCCs\n");
1696 offset += sprintf(buf+offset,"Mac:");
1697 for(j=0;j<ETH_ALEN;j++) {
1698 offset+=sprintf(buf+offset,"%2.2x ",
1699 rulla->mac_addr[j]&0xff);
1701 offset +=sprintf(buf+offset,"Atm:");
1702 for(j=0;j<ATM_ESA_LEN;j++) {
1703 offset+=sprintf(buf+offset,"%2.2x ",
1704 rulla->atm_addr[j]&0xff);
1706 offset+=sprintf(buf+offset,
1707 "Vcc vpi:%d vci:%d, Recv_vcc vpi:%d vci:%d Last_used:%lx, Timestamp:%lx, No_tries:%d ",
1708 rulla->vcc?rulla->vcc->vpi:0,
1709 rulla->vcc?rulla->vcc->vci:0,
1710 rulla->recv_vcc?rulla->recv_vcc->vpi:0,
1711 rulla->recv_vcc?rulla->recv_vcc->vci:0,
1713 rulla->timestamp, rulla->no_tries);
1714 offset+=sprintf(buf+offset,
1715 "Flags:%x, Packets_flooded:%x, Status: %s ",
1716 rulla->flags, rulla->packets_flooded,
1717 get_status_string(rulla->status));
1718 offset+=sprintf(buf+offset,"->%lx\n",(long)rulla->next);
1719 rulla = rulla->next;
1727 * Destruction of arp-cache
1730 lec_arp_destroy(struct lec_priv *priv)
1732 unsigned long flags;
1733 struct lec_arp_table *entry, *next;
1736 del_timer_sync(&priv->lec_arp_timer);
1739 * Remove all entries
1742 spin_lock_irqsave(&priv->lec_arp_lock, flags);
1743 for (i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
1744 for(entry = priv->lec_arp_tables[i]; entry != NULL; entry=next) {
1746 lec_arp_remove(priv, entry);
1750 entry = priv->lec_arp_empty_ones;
1753 del_timer_sync(&entry->timer);
1754 lec_arp_clear_vccs(entry);
1758 priv->lec_arp_empty_ones = NULL;
1759 entry = priv->lec_no_forward;
1762 del_timer_sync(&entry->timer);
1763 lec_arp_clear_vccs(entry);
1767 priv->lec_no_forward = NULL;
1768 entry = priv->mcast_fwds;
1771 /* No timer, LANEv2 7.1.20 and 2.3.5.3 */
1772 lec_arp_clear_vccs(entry);
1776 priv->mcast_fwds = NULL;
1777 priv->mcast_vcc = NULL;
1778 memset(priv->lec_arp_tables, 0,
1779 sizeof(struct lec_arp_table *) * LEC_ARP_TABLE_SIZE);
1780 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
1785 * Find entry by mac_address
1787 static struct lec_arp_table*
1788 lec_arp_find(struct lec_priv *priv,
1789 unsigned char *mac_addr)
1791 unsigned short place;
1792 struct lec_arp_table *to_return;
1794 DPRINTK("LEC_ARP: lec_arp_find :%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
1795 mac_addr[0]&0xff, mac_addr[1]&0xff, mac_addr[2]&0xff,
1796 mac_addr[3]&0xff, mac_addr[4]&0xff, mac_addr[5]&0xff);
1797 place = HASH(mac_addr[ETH_ALEN-1]);
1799 to_return = priv->lec_arp_tables[place];
1801 if (!compare_ether_addr(mac_addr, to_return->mac_addr)) {
1804 to_return = to_return->next;
1809 static struct lec_arp_table*
1810 make_entry(struct lec_priv *priv, unsigned char *mac_addr)
1812 struct lec_arp_table *to_return;
1814 to_return = kmalloc(sizeof(struct lec_arp_table), GFP_ATOMIC);
1816 printk("LEC: Arp entry kmalloc failed\n");
1819 memset(to_return, 0, sizeof(struct lec_arp_table));
1820 memcpy(to_return->mac_addr, mac_addr, ETH_ALEN);
1821 init_timer(&to_return->timer);
1822 to_return->timer.function = lec_arp_expire_arp;
1823 to_return->timer.data = (unsigned long) to_return;
1824 to_return->last_used = jiffies;
1825 to_return->priv = priv;
1826 skb_queue_head_init(&to_return->tx_wait);
1832 * Arp sent timer expired
1836 lec_arp_expire_arp(unsigned long data)
1838 struct lec_arp_table *entry;
1840 entry = (struct lec_arp_table *)data;
1842 DPRINTK("lec_arp_expire_arp\n");
1843 if (entry->status == ESI_ARP_PENDING) {
1844 if (entry->no_tries <= entry->priv->max_retry_count) {
1845 if (entry->is_rdesc)
1846 send_to_lecd(entry->priv, l_rdesc_arp_xmt, entry->mac_addr, NULL, NULL);
1848 send_to_lecd(entry->priv, l_arp_xmt, entry->mac_addr, NULL, NULL);
1851 mod_timer(&entry->timer, jiffies + (1*HZ));
1857 * Unknown/unused vcc expire, remove associated entry
1861 lec_arp_expire_vcc(unsigned long data)
1863 unsigned long flags;
1864 struct lec_arp_table *to_remove = (struct lec_arp_table*)data;
1865 struct lec_priv *priv = (struct lec_priv *)to_remove->priv;
1866 struct lec_arp_table *entry = NULL;
1868 del_timer(&to_remove->timer);
1870 DPRINTK("LEC_ARP %p %p: lec_arp_expire_vcc vpi:%d vci:%d\n",
1872 to_remove->vcc?to_remove->recv_vcc->vpi:0,
1873 to_remove->vcc?to_remove->recv_vcc->vci:0);
1874 DPRINTK("eo:%p nf:%p\n",priv->lec_arp_empty_ones,priv->lec_no_forward);
1876 spin_lock_irqsave(&priv->lec_arp_lock, flags);
1877 if (to_remove == priv->lec_arp_empty_ones)
1878 priv->lec_arp_empty_ones = to_remove->next;
1880 entry = priv->lec_arp_empty_ones;
1881 while (entry && entry->next != to_remove)
1882 entry = entry->next;
1884 entry->next = to_remove->next;
1887 if (to_remove == priv->lec_no_forward) {
1888 priv->lec_no_forward = to_remove->next;
1890 entry = priv->lec_no_forward;
1891 while (entry && entry->next != to_remove)
1892 entry = entry->next;
1894 entry->next = to_remove->next;
1897 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
1899 lec_arp_clear_vccs(to_remove);
1906 * 2. For each entry, delete entries that have aged past the age limit.
1907 * 3. For each entry, depending on the status of the entry, perform
1908 * the following maintenance.
1909 * a. If status is ESI_VC_PENDING or ESI_ARP_PENDING then if the
1910 * tick_count is above the max_unknown_frame_time, clear
1911 * the tick_count to zero and clear the packets_flooded counter
1912 * to zero. This supports the packet rate limit per address
1913 * while flooding unknowns.
1914 * b. If the status is ESI_FLUSH_PENDING and the tick_count is greater
1915 * than or equal to the path_switching_delay, change the status
1916 * to ESI_FORWARD_DIRECT. This causes the flush period to end
1917 * regardless of the progress of the flush protocol.
1920 lec_arp_check_expire(unsigned long data)
1922 unsigned long flags;
1923 struct lec_priv *priv = (struct lec_priv *)data;
1924 struct lec_arp_table *entry, *next;
1926 unsigned long time_to_check;
1929 DPRINTK("lec_arp_check_expire %p\n",priv);
1930 DPRINTK("expire: eo:%p nf:%p\n",priv->lec_arp_empty_ones,
1931 priv->lec_no_forward);
1933 spin_lock_irqsave(&priv->lec_arp_lock, flags);
1934 for(i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
1935 for(entry = priv->lec_arp_tables[i]; entry != NULL; ) {
1936 if ((entry->flags) & LEC_REMOTE_FLAG &&
1937 priv->topology_change)
1938 time_to_check = priv->forward_delay_time;
1940 time_to_check = priv->aging_time;
1942 DPRINTK("About to expire: %lx - %lx > %lx\n",
1943 now,entry->last_used, time_to_check);
1944 if( time_after(now, entry->last_used+
1946 !(entry->flags & LEC_PERMANENT_FLAG) &&
1947 !(entry->mac_addr[0] & 0x01) ) { /* LANE2: 7.1.20 */
1949 DPRINTK("LEC:Entry timed out\n");
1951 lec_arp_remove(priv, entry);
1955 /* Something else */
1956 if ((entry->status == ESI_VC_PENDING ||
1957 entry->status == ESI_ARP_PENDING)
1958 && time_after_eq(now,
1960 priv->max_unknown_frame_time)) {
1961 entry->timestamp = jiffies;
1962 entry->packets_flooded = 0;
1963 if (entry->status == ESI_VC_PENDING)
1964 send_to_lecd(priv, l_svc_setup, entry->mac_addr, entry->atm_addr, NULL);
1966 if (entry->status == ESI_FLUSH_PENDING
1968 time_after_eq(now, entry->timestamp+
1969 priv->path_switching_delay)) {
1970 struct sk_buff *skb;
1972 while ((skb = skb_dequeue(&entry->tx_wait)) != NULL)
1973 lec_send(entry->vcc, skb, entry->priv);
1974 entry->last_used = jiffies;
1978 entry = entry->next;
1982 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
1984 mod_timer(&priv->lec_arp_timer, jiffies + LEC_ARP_REFRESH_INTERVAL);
1987 * Try to find vcc where mac_address is attached.
1990 static struct atm_vcc*
1991 lec_arp_resolve(struct lec_priv *priv, unsigned char *mac_to_find,
1992 int is_rdesc, struct lec_arp_table **ret_entry)
1994 unsigned long flags;
1995 struct lec_arp_table *entry;
1996 struct atm_vcc *found;
1998 if (mac_to_find[0] & 0x01) {
1999 switch (priv->lane_version) {
2001 return priv->mcast_vcc;
2003 case 2: /* LANE2 wants arp for multicast addresses */
2004 if (!compare_ether_addr(mac_to_find, bus_mac))
2005 return priv->mcast_vcc;
2012 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2013 entry = lec_arp_find(priv, mac_to_find);
2016 if (entry->status == ESI_FORWARD_DIRECT) {
2018 entry->last_used = jiffies;
2023 /* If the LE_ARP cache entry is still pending, reset count to 0
2024 * so another LE_ARP request can be made for this frame.
2026 if (entry->status == ESI_ARP_PENDING) {
2027 entry->no_tries = 0;
2029 /* Data direct VC not yet set up, check to see if the unknown
2030 frame count is greater than the limit. If the limit has
2031 not been reached, allow the caller to send packet to
2033 if (entry->status != ESI_FLUSH_PENDING &&
2034 entry->packets_flooded<priv->maximum_unknown_frame_count) {
2035 entry->packets_flooded++;
2036 DPRINTK("LEC_ARP: Flooding..\n");
2037 found = priv->mcast_vcc;
2040 /* We got here because entry->status == ESI_FLUSH_PENDING
2041 * or BUS flood limit was reached for an entry which is
2042 * in ESI_ARP_PENDING or ESI_VC_PENDING state.
2045 DPRINTK("lec: entry->status %d entry->vcc %p\n", entry->status, entry->vcc);
2048 /* No matching entry was found */
2049 entry = make_entry(priv, mac_to_find);
2050 DPRINTK("LEC_ARP: Making entry\n");
2052 found = priv->mcast_vcc;
2055 lec_arp_add(priv, entry);
2056 /* We want arp-request(s) to be sent */
2057 entry->packets_flooded =1;
2058 entry->status = ESI_ARP_PENDING;
2059 entry->no_tries = 1;
2060 entry->last_used = entry->timestamp = jiffies;
2061 entry->is_rdesc = is_rdesc;
2062 if (entry->is_rdesc)
2063 send_to_lecd(priv, l_rdesc_arp_xmt, mac_to_find, NULL, NULL);
2065 send_to_lecd(priv, l_arp_xmt, mac_to_find, NULL, NULL);
2066 entry->timer.expires = jiffies + (1*HZ);
2067 entry->timer.function = lec_arp_expire_arp;
2068 add_timer(&entry->timer);
2069 found = priv->mcast_vcc;
2073 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2078 lec_addr_delete(struct lec_priv *priv, unsigned char *atm_addr,
2079 unsigned long permanent)
2081 unsigned long flags;
2082 struct lec_arp_table *entry, *next;
2085 DPRINTK("lec_addr_delete\n");
2086 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2087 for(i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
2088 for(entry = priv->lec_arp_tables[i]; entry != NULL; entry = next) {
2090 if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN)
2092 !(entry->flags & LEC_PERMANENT_FLAG))) {
2093 lec_arp_remove(priv, entry);
2096 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2100 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2105 * Notifies: Response to arp_request (atm_addr != NULL)
2108 lec_arp_update(struct lec_priv *priv, unsigned char *mac_addr,
2109 unsigned char *atm_addr, unsigned long remoteflag,
2110 unsigned int targetless_le_arp)
2112 unsigned long flags;
2113 struct lec_arp_table *entry, *tmp;
2116 DPRINTK("lec:%s", (targetless_le_arp) ? "targetless ": " ");
2117 DPRINTK("lec_arp_update mac:%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n",
2118 mac_addr[0],mac_addr[1],mac_addr[2],mac_addr[3],
2119 mac_addr[4],mac_addr[5]);
2121 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2122 entry = lec_arp_find(priv, mac_addr);
2123 if (entry == NULL && targetless_le_arp)
2124 goto out; /* LANE2: ignore targetless LE_ARPs for which
2125 * we have no entry in the cache. 7.1.30
2127 if (priv->lec_arp_empty_ones) {
2128 entry = priv->lec_arp_empty_ones;
2129 if (!memcmp(entry->atm_addr, atm_addr, ATM_ESA_LEN)) {
2130 priv->lec_arp_empty_ones = entry->next;
2132 while(entry->next && memcmp(entry->next->atm_addr,
2133 atm_addr, ATM_ESA_LEN))
2134 entry = entry->next;
2137 entry = entry->next;
2138 tmp->next = entry->next;
2144 del_timer(&entry->timer);
2145 tmp = lec_arp_find(priv, mac_addr);
2147 del_timer(&tmp->timer);
2148 tmp->status = ESI_FORWARD_DIRECT;
2149 memcpy(tmp->atm_addr, atm_addr, ATM_ESA_LEN);
2150 tmp->vcc = entry->vcc;
2151 tmp->old_push = entry->old_push;
2152 tmp->last_used = jiffies;
2153 del_timer(&entry->timer);
2157 entry->status = ESI_FORWARD_DIRECT;
2158 memcpy(entry->mac_addr, mac_addr, ETH_ALEN);
2159 entry->last_used = jiffies;
2160 lec_arp_add(priv, entry);
2163 entry->flags|=LEC_REMOTE_FLAG;
2165 entry->flags&=~LEC_REMOTE_FLAG;
2166 DPRINTK("After update\n");
2167 dump_arp_table(priv);
2171 entry = lec_arp_find(priv, mac_addr);
2173 entry = make_entry(priv, mac_addr);
2176 entry->status = ESI_UNKNOWN;
2177 lec_arp_add(priv, entry);
2178 /* Temporary, changes before end of function */
2180 memcpy(entry->atm_addr, atm_addr, ATM_ESA_LEN);
2181 del_timer(&entry->timer);
2182 for(i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
2183 for(tmp = priv->lec_arp_tables[i]; tmp; tmp=tmp->next) {
2185 !memcmp(tmp->atm_addr, atm_addr,
2187 /* Vcc to this host exists */
2188 if (tmp->status > ESI_VC_PENDING) {
2190 * ESI_FLUSH_PENDING,
2191 * ESI_FORWARD_DIRECT
2193 entry->vcc = tmp->vcc;
2194 entry->old_push=tmp->old_push;
2196 entry->status=tmp->status;
2202 entry->flags|=LEC_REMOTE_FLAG;
2204 entry->flags&=~LEC_REMOTE_FLAG;
2205 if (entry->status == ESI_ARP_PENDING ||
2206 entry->status == ESI_UNKNOWN) {
2207 entry->status = ESI_VC_PENDING;
2208 send_to_lecd(priv, l_svc_setup, entry->mac_addr, atm_addr, NULL);
2210 DPRINTK("After update2\n");
2211 dump_arp_table(priv);
2213 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2217 * Notifies: Vcc setup ready
2220 lec_vcc_added(struct lec_priv *priv, struct atmlec_ioc *ioc_data,
2221 struct atm_vcc *vcc,
2222 void (*old_push)(struct atm_vcc *vcc, struct sk_buff *skb))
2224 unsigned long flags;
2225 struct lec_arp_table *entry;
2226 int i, found_entry=0;
2228 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2229 if (ioc_data->receive == 2) {
2230 /* Vcc for Multicast Forward. No timer, LANEv2 7.1.20 and 2.3.5.3 */
2232 DPRINTK("LEC_ARP: Attaching mcast forward\n");
2234 entry = lec_arp_find(priv, bus_mac);
2236 printk("LEC_ARP: Multicast entry not found!\n");
2239 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN);
2240 entry->recv_vcc = vcc;
2241 entry->old_recv_push = old_push;
2243 entry = make_entry(priv, bus_mac);
2246 del_timer(&entry->timer);
2247 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN);
2248 entry->recv_vcc = vcc;
2249 entry->old_recv_push = old_push;
2250 entry->next = priv->mcast_fwds;
2251 priv->mcast_fwds = entry;
2253 } else if (ioc_data->receive == 1) {
2254 /* Vcc which we don't want to make default vcc, attach it
2256 DPRINTK("LEC_ARP:Attaching data direct, not default :%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n",
2257 ioc_data->atm_addr[0],ioc_data->atm_addr[1],
2258 ioc_data->atm_addr[2],ioc_data->atm_addr[3],
2259 ioc_data->atm_addr[4],ioc_data->atm_addr[5],
2260 ioc_data->atm_addr[6],ioc_data->atm_addr[7],
2261 ioc_data->atm_addr[8],ioc_data->atm_addr[9],
2262 ioc_data->atm_addr[10],ioc_data->atm_addr[11],
2263 ioc_data->atm_addr[12],ioc_data->atm_addr[13],
2264 ioc_data->atm_addr[14],ioc_data->atm_addr[15],
2265 ioc_data->atm_addr[16],ioc_data->atm_addr[17],
2266 ioc_data->atm_addr[18],ioc_data->atm_addr[19]);
2267 entry = make_entry(priv, bus_mac);
2270 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN);
2271 memset(entry->mac_addr, 0, ETH_ALEN);
2272 entry->recv_vcc = vcc;
2273 entry->old_recv_push = old_push;
2274 entry->status = ESI_UNKNOWN;
2275 entry->timer.expires = jiffies + priv->vcc_timeout_period;
2276 entry->timer.function = lec_arp_expire_vcc;
2277 add_timer(&entry->timer);
2278 entry->next = priv->lec_no_forward;
2279 priv->lec_no_forward = entry;
2280 dump_arp_table(priv);
2283 DPRINTK("LEC_ARP:Attaching data direct, default:%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n",
2284 ioc_data->atm_addr[0],ioc_data->atm_addr[1],
2285 ioc_data->atm_addr[2],ioc_data->atm_addr[3],
2286 ioc_data->atm_addr[4],ioc_data->atm_addr[5],
2287 ioc_data->atm_addr[6],ioc_data->atm_addr[7],
2288 ioc_data->atm_addr[8],ioc_data->atm_addr[9],
2289 ioc_data->atm_addr[10],ioc_data->atm_addr[11],
2290 ioc_data->atm_addr[12],ioc_data->atm_addr[13],
2291 ioc_data->atm_addr[14],ioc_data->atm_addr[15],
2292 ioc_data->atm_addr[16],ioc_data->atm_addr[17],
2293 ioc_data->atm_addr[18],ioc_data->atm_addr[19]);
2294 for (i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
2295 for (entry = priv->lec_arp_tables[i]; entry; entry=entry->next) {
2296 if (memcmp(ioc_data->atm_addr, entry->atm_addr,
2298 DPRINTK("LEC_ARP: Attaching data direct\n");
2299 DPRINTK("Currently -> Vcc: %d, Rvcc:%d\n",
2300 entry->vcc?entry->vcc->vci:0,
2301 entry->recv_vcc?entry->recv_vcc->vci:0);
2303 del_timer(&entry->timer);
2305 entry->old_push = old_push;
2306 if (entry->status == ESI_VC_PENDING) {
2307 if(priv->maximum_unknown_frame_count
2312 entry->timestamp = jiffies;
2316 send_to_lecd(priv,l_flush_xmt,
2323 /* They were forming a connection
2324 to us, and we to them. Our
2325 ATM address is numerically lower
2326 than theirs, so we make connection
2327 we formed into default VCC (8.1.11).
2328 Connection they made gets torn
2329 down. This might confuse some
2330 clients. Can be changed if
2331 someone reports trouble... */
2338 DPRINTK("After vcc was added\n");
2339 dump_arp_table(priv);
2342 /* Not found, snatch address from first data packet that arrives from
2344 entry = make_entry(priv, bus_mac);
2348 entry->old_push = old_push;
2349 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN);
2350 memset(entry->mac_addr, 0, ETH_ALEN);
2351 entry->status = ESI_UNKNOWN;
2352 entry->next = priv->lec_arp_empty_ones;
2353 priv->lec_arp_empty_ones = entry;
2354 entry->timer.expires = jiffies + priv->vcc_timeout_period;
2355 entry->timer.function = lec_arp_expire_vcc;
2356 add_timer(&entry->timer);
2357 DPRINTK("After vcc was added\n");
2358 dump_arp_table(priv);
2360 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2364 lec_flush_complete(struct lec_priv *priv, unsigned long tran_id)
2366 unsigned long flags;
2367 struct lec_arp_table *entry;
2370 DPRINTK("LEC:lec_flush_complete %lx\n",tran_id);
2371 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2372 for (i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
2373 for (entry = priv->lec_arp_tables[i]; entry; entry=entry->next) {
2374 if (entry->flush_tran_id == tran_id &&
2375 entry->status == ESI_FLUSH_PENDING) {
2376 struct sk_buff *skb;
2378 while ((skb = skb_dequeue(&entry->tx_wait)) != NULL)
2379 lec_send(entry->vcc, skb, entry->priv);
2380 entry->status = ESI_FORWARD_DIRECT;
2381 DPRINTK("LEC_ARP: Flushed\n");
2385 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2386 dump_arp_table(priv);
2390 lec_set_flush_tran_id(struct lec_priv *priv,
2391 unsigned char *atm_addr, unsigned long tran_id)
2393 unsigned long flags;
2394 struct lec_arp_table *entry;
2397 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2398 for (i = 0; i < LEC_ARP_TABLE_SIZE; i++)
2399 for(entry = priv->lec_arp_tables[i]; entry; entry=entry->next)
2400 if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN)) {
2401 entry->flush_tran_id = tran_id;
2402 DPRINTK("Set flush transaction id to %lx for %p\n",tran_id,entry);
2404 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2408 lec_mcast_make(struct lec_priv *priv, struct atm_vcc *vcc)
2410 unsigned long flags;
2411 unsigned char mac_addr[] = {
2412 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2413 struct lec_arp_table *to_add;
2414 struct lec_vcc_priv *vpriv;
2417 if (!(vpriv = kmalloc(sizeof(struct lec_vcc_priv), GFP_KERNEL)))
2420 vpriv->old_pop = vcc->pop;
2421 vcc->user_back = vpriv;
2423 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2424 to_add = make_entry(priv, mac_addr);
2426 vcc->pop = vpriv->old_pop;
2431 memcpy(to_add->atm_addr, vcc->remote.sas_addr.prv, ATM_ESA_LEN);
2432 to_add->status = ESI_FORWARD_DIRECT;
2433 to_add->flags |= LEC_PERMANENT_FLAG;
2435 to_add->old_push = vcc->push;
2436 vcc->push = lec_push;
2437 priv->mcast_vcc = vcc;
2438 lec_arp_add(priv, to_add);
2440 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2445 lec_vcc_close(struct lec_priv *priv, struct atm_vcc *vcc)
2447 unsigned long flags;
2448 struct lec_arp_table *entry, *next;
2451 DPRINTK("LEC_ARP: lec_vcc_close vpi:%d vci:%d\n",vcc->vpi,vcc->vci);
2452 dump_arp_table(priv);
2453 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2454 for(i=0;i<LEC_ARP_TABLE_SIZE;i++) {
2455 for(entry = priv->lec_arp_tables[i];entry; entry=next) {
2457 if (vcc == entry->vcc) {
2458 lec_arp_remove(priv, entry);
2460 if (priv->mcast_vcc == vcc) {
2461 priv->mcast_vcc = NULL;
2467 entry = priv->lec_arp_empty_ones;
2468 priv->lec_arp_empty_ones = NULL;
2469 while (entry != NULL) {
2471 if (entry->vcc == vcc) { /* leave it out from the list */
2472 lec_arp_clear_vccs(entry);
2473 del_timer(&entry->timer);
2476 else { /* put it back to the list */
2477 entry->next = priv->lec_arp_empty_ones;
2478 priv->lec_arp_empty_ones = entry;
2483 entry = priv->lec_no_forward;
2484 priv->lec_no_forward = NULL;
2485 while (entry != NULL) {
2487 if (entry->recv_vcc == vcc) {
2488 lec_arp_clear_vccs(entry);
2489 del_timer(&entry->timer);
2493 entry->next = priv->lec_no_forward;
2494 priv->lec_no_forward = entry;
2499 entry = priv->mcast_fwds;
2500 priv->mcast_fwds = NULL;
2501 while (entry != NULL) {
2503 if (entry->recv_vcc == vcc) {
2504 lec_arp_clear_vccs(entry);
2505 /* No timer, LANEv2 7.1.20 and 2.3.5.3 */
2509 entry->next = priv->mcast_fwds;
2510 priv->mcast_fwds = entry;
2515 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2516 dump_arp_table(priv);
2520 lec_arp_check_empties(struct lec_priv *priv,
2521 struct atm_vcc *vcc, struct sk_buff *skb)
2523 unsigned long flags;
2524 struct lec_arp_table *entry, *prev;
2525 struct lecdatahdr_8023 *hdr = (struct lecdatahdr_8023 *)skb->data;
2528 struct lecdatahdr_8025 *tr_hdr = (struct lecdatahdr_8025 *)skb->data;
2530 if (priv->is_trdev) src = tr_hdr->h_source;
2533 src = hdr->h_source;
2535 spin_lock_irqsave(&priv->lec_arp_lock, flags);
2536 entry = priv->lec_arp_empty_ones;
2537 if (vcc == entry->vcc) {
2538 del_timer(&entry->timer);
2539 memcpy(entry->mac_addr, src, ETH_ALEN);
2540 entry->status = ESI_FORWARD_DIRECT;
2541 entry->last_used = jiffies;
2542 priv->lec_arp_empty_ones = entry->next;
2543 /* We might have got an entry */
2544 if ((prev = lec_arp_find(priv,src))) {
2545 lec_arp_remove(priv, prev);
2548 lec_arp_add(priv, entry);
2552 entry = entry->next;
2553 while (entry && entry->vcc != vcc) {
2555 entry = entry->next;
2558 DPRINTK("LEC_ARP: Arp_check_empties: entry not found!\n");
2561 del_timer(&entry->timer);
2562 memcpy(entry->mac_addr, src, ETH_ALEN);
2563 entry->status = ESI_FORWARD_DIRECT;
2564 entry->last_used = jiffies;
2565 prev->next = entry->next;
2566 if ((prev = lec_arp_find(priv, src))) {
2567 lec_arp_remove(priv, prev);
2570 lec_arp_add(priv, entry);
2572 spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
2574 MODULE_LICENSE("GPL");