···2121/* Maximum number of LEC interfaces (tweakable) */2222#define MAX_LEC_ITF 4823232424-/*2525- * From the total of MAX_LEC_ITF, last NUM_TR_DEVS are reserved for Token Ring.2626- * E.g. if MAX_LEC_ITF = 48 and NUM_TR_DEVS = 8, then lec0-lec39 are for2727- * Ethernet ELANs and lec40-lec47 are for Token Ring ELANS.2828- */2929-#define NUM_TR_DEVS 83030-3124typedef enum {3225 l_set_mac_addr,3326 l_del_mac_addr,
+8-130
net/atm/lec.c
···2626#include <linux/spinlock.h>2727#include <linux/seq_file.h>28282929-/* TokenRing if needed */3030-#ifdef CONFIG_TR3131-#include <linux/trdevice.h>3232-#endif3333-3429/* And atm device */3530#include <linux/atmdev.h>3631#include <linux/atmlec.h>···158163#endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */159164160165/*161161- * Modelled after tr_type_trans162162- * All multicast and ARE or STE frames go to BUS.163163- * Non source routed frames go by destination address.164164- * Last hop source routed frames go by destination address.165165- * Not last hop source routed frames go by _next_ route descriptor.166166- * Returns pointer to destination MAC address or fills in rdesc167167- * and returns NULL.168168- */169169-#ifdef CONFIG_TR170170-static unsigned char *get_tr_dst(unsigned char *packet, unsigned char *rdesc)171171-{172172- struct trh_hdr *trh;173173- unsigned int riflen, num_rdsc;174174-175175- trh = (struct trh_hdr *)packet;176176- if (trh->daddr[0] & (uint8_t) 0x80)177177- return bus_mac; /* multicast */178178-179179- if (trh->saddr[0] & TR_RII) {180180- riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;181181- if ((ntohs(trh->rcf) >> 13) != 0)182182- return bus_mac; /* ARE or STE */183183- } else184184- return trh->daddr; /* not source routed */185185-186186- if (riflen < 6)187187- return trh->daddr; /* last hop, source routed */188188-189189- /* riflen is 6 or more, packet has more than one route descriptor */190190- num_rdsc = (riflen / 2) - 1;191191- memset(rdesc, 0, ETH_ALEN);192192- /* offset 4 comes from LAN destination field in LE control frames */193193- if (trh->rcf & htons((uint16_t) TR_RCF_DIR_BIT))194194- memcpy(&rdesc[4], &trh->rseg[num_rdsc - 2], sizeof(__be16));195195- else {196196- memcpy(&rdesc[4], &trh->rseg[1], sizeof(__be16));197197- rdesc[5] = ((ntohs(trh->rseg[0]) & 0x000f) | (rdesc[5] & 0xf0));198198- }199199-200200- return NULL;201201-}202202-#endif /* CONFIG_TR */203203-204204-/*205166 * Open/initialize the netdevice. This is called (in the current kernel)206167 * sometime after booting when the 'ifconfig' program is run.207168 *···208257 struct lec_arp_table *entry;209258 unsigned char *dst;210259 int min_frame_size;211211-#ifdef CONFIG_TR212212- unsigned char rdesc[ETH_ALEN]; /* Token Ring route descriptor */213213-#endif214260 int is_rdesc;215261216262 pr_debug("called\n");···238290 }239291 skb_push(skb, 2);240292241241- /* Put le header to place, works for TokenRing too */293293+ /* Put le header to place */242294 lec_h = (struct lecdatahdr_8023 *)skb->data;243295 lec_h->le_header = htons(priv->lecid);244244-245245-#ifdef CONFIG_TR246246- /*247247- * Ugly. Use this to realign Token Ring packets for248248- * e.g. PCA-200E driver.249249- */250250- if (priv->is_trdev) {251251- skb2 = skb_realloc_headroom(skb, LEC_HEADER_LEN);252252- kfree_skb(skb);253253- if (skb2 == NULL)254254- return NETDEV_TX_OK;255255- skb = skb2;256256- }257257-#endif258296259297#if DUMP_PACKETS >= 2260298#define MAX_DUMP_SKB 99···255321#endif /* DUMP_PACKETS >= 1 */256322257323 /* Minimum ethernet-frame size */258258-#ifdef CONFIG_TR259259- if (priv->is_trdev)260260- min_frame_size = LEC_MINIMUM_8025_SIZE;261261- else262262-#endif263263- min_frame_size = LEC_MINIMUM_8023_SIZE;324324+ min_frame_size = LEC_MINIMUM_8023_SIZE;264325 if (skb->len < min_frame_size) {265326 if ((skb->len + skb_tailroom(skb)) < min_frame_size) {266327 skb2 = skb_copy_expand(skb, 0,···274345 /* Send to right vcc */275346 is_rdesc = 0;276347 dst = lec_h->h_dest;277277-#ifdef CONFIG_TR278278- if (priv->is_trdev) {279279- dst = get_tr_dst(skb->data + 2, rdesc);280280- if (dst == NULL) {281281- dst = rdesc;282282- is_rdesc = 1;283283- }284284- }285285-#endif286348 entry = NULL;287349 vcc = lec_arp_resolve(priv, dst, is_rdesc, &entry);288350 pr_debug("%s:vcc:%p vcc_flags:%lx, entry:%p\n",···630710 dev_kfree_skb(skb);631711 return;632712 }633633-#ifdef CONFIG_TR634634- if (priv->is_trdev)635635- dst = ((struct lecdatahdr_8025 *)skb->data)->h_dest;636636- else637637-#endif638638- dst = ((struct lecdatahdr_8023 *)skb->data)->h_dest;713713+ dst = ((struct lecdatahdr_8023 *)skb->data)->h_dest;639714640715 /*641716 * If this is a Data Direct VCC, and the VCC does not match···638723 */639724 spin_lock_irqsave(&priv->lec_arp_lock, flags);640725 if (lec_is_data_direct(vcc)) {641641-#ifdef CONFIG_TR642642- if (priv->is_trdev)643643- src =644644- ((struct lecdatahdr_8025 *)skb->data)->645645- h_source;646646- else647647-#endif648648- src =649649- ((struct lecdatahdr_8023 *)skb->data)->650650- h_source;726726+ src = ((struct lecdatahdr_8023 *)skb->data)->h_source;651727 entry = lec_arp_find(priv, src);652728 if (entry && entry->vcc != vcc) {653729 lec_arp_remove(priv, entry);···656750 if (!hlist_empty(&priv->lec_arp_empty_ones))657751 lec_arp_check_empties(priv, vcc, skb);658752 skb_pull(skb, 2); /* skip lec_id */659659-#ifdef CONFIG_TR660660- if (priv->is_trdev)661661- skb->protocol = tr_type_trans(skb, dev);662662- else663663-#endif664664- skb->protocol = eth_type_trans(skb, dev);753753+ skb->protocol = eth_type_trans(skb, dev);665754 dev->stats.rx_packets++;666755 dev->stats.rx_bytes += skb->len;667756 memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));···728827 i = 0;729828 else730829 i = arg;731731-#ifdef CONFIG_TR732830 if (arg >= MAX_LEC_ITF)733831 return -EINVAL;734734-#else /* Reserve the top NUM_TR_DEVS for TR */735735- if (arg >= (MAX_LEC_ITF - NUM_TR_DEVS))736736- return -EINVAL;737737-#endif738832 if (!dev_lec[i]) {739739- int is_trdev, size;740740-741741- is_trdev = 0;742742- if (i >= (MAX_LEC_ITF - NUM_TR_DEVS))743743- is_trdev = 1;833833+ int size;744834745835 size = sizeof(struct lec_priv);746746-#ifdef CONFIG_TR747747- if (is_trdev)748748- dev_lec[i] = alloc_trdev(size);749749- else750750-#endif751751- dev_lec[i] = alloc_etherdev(size);836836+ dev_lec[i] = alloc_etherdev(size);752837 if (!dev_lec[i])753838 return -ENOMEM;754839 dev_lec[i]->netdev_ops = &lec_netdev_ops;···745858 }746859747860 priv = netdev_priv(dev_lec[i]);748748- priv->is_trdev = is_trdev;749861 } else {750862 priv = netdev_priv(dev_lec[i]);751863 if (priv->lecd)···22582372 struct hlist_node *node, *next;22592373 struct lec_arp_table *entry, *tmp;22602374 struct lecdatahdr_8023 *hdr = (struct lecdatahdr_8023 *)skb->data;22612261- unsigned char *src;22622262-#ifdef CONFIG_TR22632263- struct lecdatahdr_8025 *tr_hdr = (struct lecdatahdr_8025 *)skb->data;22642264-22652265- if (priv->is_trdev)22662266- src = tr_hdr->h_source;22672267- else22682268-#endif22692269- src = hdr->h_source;23752375+ unsigned char *src = hdr->h_source;2270237622712377 spin_lock_irqsave(&priv->lec_arp_lock, flags);22722378 hlist_for_each_entry_safe(entry, node, next,
-1
net/atm/lec.h
···142142 int itfnum; /* e.g. 2 for lec2, 5 for lec5 */143143 struct lane2_ops *lane2_ops; /* can be NULL for LANE v1 */144144 int is_proxy; /* bridge between ATM and Ethernet */145145- int is_trdev; /* Device type, 0 = Ethernet, 1 = TokenRing */146145};147146148147struct lec_vcc_priv {