patch-2.4.21 linux-2.4.21/net/802/fc.c

Next file: linux-2.4.21/net/802/tr.c
Previous file: linux-2.4.21/net/802/Makefile
Back to the patch index
Back to the overall index

diff -urN linux-2.4.20/net/802/fc.c linux-2.4.21/net/802/fc.c
@@ -11,6 +11,8 @@
  */
 
 #include <linux/config.h>
+#include <linux/module.h>
+
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <linux/types.h>
@@ -95,4 +97,39 @@
 	return 0;
 #endif
 }
-	
+
+EXPORT_SYMBOL(fc_type_trans);
+
+unsigned short
+fc_type_trans(struct sk_buff *skb, struct net_device *dev)
+{
+	struct fch_hdr *fch = (struct fch_hdr *)skb->data;
+	struct fcllc *fcllc;
+
+	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;
+	}
+
+	return ntohs(ETH_P_802_2);
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)