Commit de0016d4 authored by Christoph Hellwig's avatar Christoph Hellwig

[NET]: Move fc_type_trans into generic code.

parent ab6671e9
...@@ -3175,38 +3175,6 @@ struct fch_hdr fch; ...@@ -3175,38 +3175,6 @@ struct fch_hdr fch;
LEAVE("rx_net_mfs_packet"); 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) 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; u_char df_ctl;
......
...@@ -31,7 +31,7 @@ extern int fc_header(struct sk_buff *skb, struct net_device *dev, ...@@ -31,7 +31,7 @@ extern int fc_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, void *daddr, unsigned short type, void *daddr,
void *saddr, unsigned len); void *saddr, unsigned len);
extern int fc_rebuild_header(struct sk_buff *skb); 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 *init_fcdev(struct net_device *dev, int sizeof_priv);
extern struct net_device *alloc_fcdev(int sizeof_priv); extern struct net_device *alloc_fcdev(int sizeof_priv);
......
...@@ -95,4 +95,37 @@ int fc_rebuild_header(struct sk_buff *skb) ...@@ -95,4 +95,37 @@ int fc_rebuild_header(struct sk_buff *skb)
return 0; return 0;
#endif #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);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment