* v 1.0 03/22/99
*/
-#include <linux/config.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <linux/types.h>
* 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;
*/
if (type == ETH_P_IP || type == ETH_P_ARP)
{
- struct fcllc *fcllc=(struct fcllc *)(fch+1);
+ struct fcllc *fcllc;
hdr_len = sizeof(struct fch_hdr) + sizeof(struct fcllc);
fch = (struct fch_hdr *)skb_push(skb, hdr_len);
* 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
#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);