summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/fc/iph5526.c32
-rw-r--r--include/linux/fcdevice.h2
-rw-r--r--net/802/fc.c35
3 files changed, 35 insertions, 34 deletions
diff --git a/drivers/net/fc/iph5526.c b/drivers/net/fc/iph5526.c
index 4eaa4a26299d..9e5afc18f1a8 100644
--- a/drivers/net/fc/iph5526.c
+++ b/drivers/net/fc/iph5526.c
@@ -3175,38 +3175,6 @@ struct fch_hdr fch;
LEAVE("rx_net_mfs_packet");
}
-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);
-}
-
static int tx_exchange(struct fc_info *fi, char *data, u_int len, u_int r_ctl, u_int type, u_int d_id, u_int mtu, int int_required, u_short tx_ox_id, u_int frame_class)
{
u_char df_ctl;
diff --git a/include/linux/fcdevice.h b/include/linux/fcdevice.h
index 25687bb17c70..8b81098ea96f 100644
--- a/include/linux/fcdevice.h
+++ b/include/linux/fcdevice.h
@@ -31,7 +31,7 @@ extern int fc_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, void *daddr,
void *saddr, unsigned len);
extern int fc_rebuild_header(struct sk_buff *skb);
-//extern unsigned short fc_type_trans(struct sk_buff *skb, struct net_device *dev);
+extern unsigned short fc_type_trans(struct sk_buff *skb, struct net_device *dev);
extern struct net_device *init_fcdev(struct net_device *dev, int sizeof_priv);
extern struct net_device *alloc_fcdev(int sizeof_priv);
diff --git a/net/802/fc.c b/net/802/fc.c
index d34031fe85a1..7fa81023a3fa 100644
--- a/net/802/fc.c
+++ b/net/802/fc.c
@@ -95,4 +95,37 @@ int fc_rebuild_header(struct sk_buff *skb)
return 0;
#endif
}
-
+
+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);
+}