fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / net / 802 / fc.c
index e700918..2a27e37 100644 (file)
@@ -10,7 +10,6 @@
  *             v 1.0 03/22/99
  */
 
-#include <linux/config.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <linux/types.h>
@@ -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);