X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2F802%2Ffc.c;h=2a27e37bc4cb263869b0e5a20643997064067713;hb=refs%2Fheads%2Fvserver;hp=e7009186a8229fc036b1b91bf23b3a72c332e7ea;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/net/802/fc.c b/net/802/fc.c index e7009186a..2a27e37bc 100644 --- a/net/802/fc.c +++ b/net/802/fc.c @@ -10,7 +10,6 @@ * v 1.0 03/22/99 */ -#include #include #include #include @@ -35,8 +34,9 @@ * Put the headers on a Fibre Channel packet. */ -int fc_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, - void *daddr, void *saddr, unsigned len) +static int fc_header(struct sk_buff *skb, struct net_device *dev, + unsigned short type, + void *daddr, void *saddr, unsigned len) { struct fch_hdr *fch; int hdr_len; @@ -81,12 +81,12 @@ int fc_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, * can now send the packet. */ -int fc_rebuild_header(struct sk_buff *skb) +static int fc_rebuild_header(struct sk_buff *skb) { struct fch_hdr *fch=(struct fch_hdr *)skb->data; struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr)); if(fcllc->ethertype != htons(ETH_P_IP)) { - printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(fcllc->ethertype)); + printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(fcllc->ethertype)); return 0; } #ifdef CONFIG_INET @@ -96,36 +96,34 @@ int fc_rebuild_header(struct sk_buff *skb) #endif } -unsigned short -fc_type_trans(struct sk_buff *skb, struct net_device *dev) +static void fc_setup(struct net_device *dev) { - struct fch_hdr *fch = (struct fch_hdr *)skb->data; - struct fcllc *fcllc; + dev->hard_header = fc_header; + dev->rebuild_header = fc_rebuild_header; + + dev->type = ARPHRD_IEEE802; + dev->hard_header_len = FC_HLEN; + dev->mtu = 2024; + dev->addr_len = FC_ALEN; + dev->tx_queue_len = 100; /* Long queues on fc */ + dev->flags = IFF_BROADCAST; - skb->mac.raw = skb->data; - fcllc = (struct fcllc *)(skb->data + sizeof (struct fch_hdr) + 2); - skb_pull(skb, sizeof (struct fch_hdr) + 2); - - if (*fch->daddr & 1) { - if (!memcmp(fch->daddr, dev->broadcast, FC_ALEN)) - skb->pkt_type = PACKET_BROADCAST; - else - skb->pkt_type = PACKET_MULTICAST; - } else if (dev->flags & IFF_PROMISC) { - if (memcmp(fch->daddr, dev->dev_addr, FC_ALEN)) - skb->pkt_type = PACKET_OTHERHOST; - } - - /* - * Strip the SNAP header from ARP packets since we don't pass - * them through to the 802.2/SNAP layers. - */ - if (fcllc->dsap == EXTENDED_SAP && - (fcllc->ethertype == ntohs(ETH_P_IP) || - fcllc->ethertype == ntohs(ETH_P_ARP))) { - skb_pull(skb, sizeof (struct fcllc)); - return fcllc->ethertype; - } + memset(dev->broadcast, 0xFF, FC_ALEN); +} - return ntohs(ETH_P_802_2); +/** + * alloc_fcdev - Register fibre channel device + * @sizeof_priv: Size of additional driver-private structure to be allocated + * for this fibre channel device + * + * Fill in the fields of the device structure with fibre channel-generic values. + * + * Constructs a new net device, complete with a private data area of + * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for + * this private data area. + */ +struct net_device *alloc_fcdev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "fc%d", fc_setup); } +EXPORT_SYMBOL(alloc_fcdev);