From 19c9bba94152148523ba0f7ef7cffe3d45656b11 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Tue, 29 Apr 1997 21:13:14 +0000 Subject: Import of Linux/MIPS 2.1.36 --- net/802/fddi.c | 115 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 58 insertions(+), 57 deletions(-) (limited to 'net/802/fddi.c') diff --git a/net/802/fddi.c b/net/802/fddi.c index 24fcff127..c57a967d1 100644 --- a/net/802/fddi.c +++ b/net/802/fddi.c @@ -20,7 +20,11 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * + * Changes + * Alan Cox : New arp/rebuild header */ + #include #include #include @@ -33,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -45,28 +50,26 @@ * daddr=NULL means leave destination address (eg unresolved arp) */ -int fddi_header( - struct sk_buff *skb, - struct device *dev, - unsigned short type, - void *daddr, - void *saddr, - unsigned len - ) - +int fddi_header(struct sk_buff *skb, struct device *dev, unsigned short type, + void *daddr, void *saddr, unsigned len) +{ + int hl = FDDI_K_SNAP_HLEN; + struct fddihdr *fddi; + + if(type!=htons(ETH_P_IP)) + hl=FDDI_K_8022_HLEN-3; + fddi = (struct fddihdr *)skb_push(skb, hl); + fddi->fc = FDDI_FC_K_ASYNC_LLC_DEF; + if(type==htons(ETH_P_IP)) { - struct fddihdr *fddi = (struct fddihdr *)skb_push(skb, FDDI_K_SNAP_HLEN); - - /* Fill in frame header - assume 802.2 SNAP frames for now */ - - fddi->fc = FDDI_FC_K_ASYNC_LLC_DEF; - fddi->hdr.llc_snap.dsap = FDDI_EXTENDED_SAP; - fddi->hdr.llc_snap.ssap = FDDI_EXTENDED_SAP; - fddi->hdr.llc_snap.ctrl = FDDI_UI_CMD; - fddi->hdr.llc_snap.oui[0] = 0x00; - fddi->hdr.llc_snap.oui[1] = 0x00; - fddi->hdr.llc_snap.oui[2] = 0x00; - fddi->hdr.llc_snap.ethertype = htons(type); + fddi->hdr.llc_snap.dsap = FDDI_EXTENDED_SAP; + fddi->hdr.llc_snap.ssap = FDDI_EXTENDED_SAP; + fddi->hdr.llc_snap.ctrl = FDDI_UI_CMD; + fddi->hdr.llc_snap.oui[0] = 0x00; + fddi->hdr.llc_snap.oui[1] = 0x00; + fddi->hdr.llc_snap.oui[2] = 0x00; + fddi->hdr.llc_snap.ethertype = htons(type); + } /* Set the source and destination hardware addresses */ @@ -76,12 +79,12 @@ int fddi_header( memcpy(fddi->saddr, dev->dev_addr, dev->addr_len); if (daddr != NULL) - { + { memcpy(fddi->daddr, daddr, dev->addr_len); - return(FDDI_K_SNAP_HLEN); - } - return(-FDDI_K_SNAP_HLEN); + return(hl); } + return(-hl); +} /* @@ -90,32 +93,22 @@ int fddi_header( * this sk_buff. We now let ARP fill in the other fields. */ -int fddi_rebuild_header( - void *buff, - struct device *dev, - unsigned long dest, - struct sk_buff *skb - ) - - { - struct fddihdr *fddi = (struct fddihdr *)buff; +int fddi_rebuild_header(struct sk_buff *skb) +{ + struct fddihdr *fddi = (struct fddihdr *)skb->data; /* Only ARP/IP is currently supported */ if (fddi->hdr.llc_snap.ethertype != htons(ETH_P_IP)) - { + { printk("fddi_rebuild_header: Don't know how to resolve type %04X addresses?\n", (unsigned int)htons(fddi->hdr.llc_snap.ethertype)); return(0); - } + } /* Try to get ARP to resolve the header and fill destination address */ - if (arp_find(fddi->daddr, dest, dev, dev->pa_addr, skb)) - return(1); - else - return(0); - } - + return arp_find(fddi->daddr, skb) ? 1 : 0; +} /* * Determine the packet's protocol ID and fill in skb fields. @@ -124,39 +117,47 @@ int fddi_rebuild_header( * the proper pointer to the start of packet data (skb->data). */ -unsigned short fddi_type_trans( - struct sk_buff *skb, - struct device *dev - ) - - { +unsigned short fddi_type_trans(struct sk_buff *skb, struct device *dev) +{ struct fddihdr *fddi = (struct fddihdr *)skb->data; - + unsigned short type; + /* * Set mac.raw field to point to FC byte, set data field to point * to start of packet data. Assume 802.2 SNAP frames for now. */ skb->mac.raw = skb->data; /* point to frame control (FC) */ - skb_pull(skb, FDDI_K_SNAP_HLEN); /* adjust for 21 byte header */ - + + if(fddi->hdr.llc_8022_1.dsap==0xe0) + { + skb_pull(skb, FDDI_K_8022_HLEN-3); + type=htons(ETH_P_802_2); + } + else + { + skb_pull(skb, FDDI_K_SNAP_HLEN); /* adjust for 21 byte header */ + type=fddi->hdr.llc_snap.ethertype; + } + /* Set packet type based on destination address and flag settings */ if (*fddi->daddr & 0x01) - { + { if (memcmp(fddi->daddr, dev->broadcast, FDDI_K_ALEN) == 0) skb->pkt_type = PACKET_BROADCAST; else skb->pkt_type = PACKET_MULTICAST; - } + } else if (dev->flags & IFF_PROMISC) - { + { if (memcmp(fddi->daddr, dev->dev_addr, FDDI_K_ALEN)) skb->pkt_type = PACKET_OTHERHOST; - } + } /* Assume 802.2 SNAP frames, for now */ - return(fddi->hdr.llc_snap.ethertype); - } + return(type); + +} -- cgit v1.2.3