[SKBUFF] introduce eth_hdr(skb)

This is the start of a series of patches to remove protocol
specific stuff out of include/linux/skbuff.h and to make the
struct sk_buff header pointers private, i.e. they will only
be accessible thru foo_hdr(skb) and some other accessor
functions.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@conectiva.com.br>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent 953c48f8
...@@ -1369,7 +1369,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -1369,7 +1369,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)
skb->mac.raw = skb->data; skb->mac.raw = skb->data;
skb_pull(skb, ETH_HLEN); skb_pull(skb, ETH_HLEN);
eth = skb->mac.ethernet; eth = eth_hdr(skb);
if (*eth->h_dest & 1) { if (*eth->h_dest & 1) {
if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
......
...@@ -142,7 +142,7 @@ static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb, ...@@ -142,7 +142,7 @@ static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb,
skb->mac.raw=skb->data; skb->mac.raw=skb->data;
skb_pull(skb,dev->hard_header_len); skb_pull(skb,dev->hard_header_len);
eth= skb->mac.ethernet; eth = eth_hdr(skb);
if (*eth->h_dest & 1) { if (*eth->h_dest & 1) {
if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0)
......
...@@ -1285,7 +1285,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) ...@@ -1285,7 +1285,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
int res = 1; int res = 1;
skb->mac.raw = (unsigned char *)skb->data; skb->mac.raw = (unsigned char *)skb->data;
eth_data = (struct ethhdr *)skb->data; eth_data = eth_hdr(skb);
/* make sure that the curr_active_slave and the slaves list do /* make sure that the curr_active_slave and the slaves list do
* not change during tx * not change during tx
......
...@@ -506,7 +506,7 @@ static struct net_device_stats *ioc3_get_stats(struct net_device *dev) ...@@ -506,7 +506,7 @@ static struct net_device_stats *ioc3_get_stats(struct net_device *dev)
static void ioc3_tcpudp_checksum(struct sk_buff *skb, uint32_t hwsum, int len) static void ioc3_tcpudp_checksum(struct sk_buff *skb, uint32_t hwsum, int len)
{ {
struct ethhdr *eh = skb->mac.ethernet; struct ethhdr *eh = eth_hdr(skb);
uint32_t csum, ehsum; uint32_t csum, ehsum;
unsigned int proto; unsigned int proto;
struct iphdr *ih; struct iphdr *ih;
...@@ -1333,7 +1333,7 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1333,7 +1333,7 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev)
uint32_t csum, ehsum; uint32_t csum, ehsum;
uint16_t *eh; uint16_t *eh;
/* The MAC header. skb->mac.ethernet seem the logic approach /* The MAC header. skb->mac seem the logic approach
to find the MAC header - except it's a NULL pointer ... */ to find the MAC header - except it's a NULL pointer ... */
eh = (uint16_t *) skb->data; eh = (uint16_t *) skb->data;
......
...@@ -376,7 +376,7 @@ static unsigned short myri_type_trans(struct sk_buff *skb, struct net_device *de ...@@ -376,7 +376,7 @@ static unsigned short myri_type_trans(struct sk_buff *skb, struct net_device *de
skb->mac.raw = (((unsigned char *)skb->data) + MYRI_PAD_LEN); skb->mac.raw = (((unsigned char *)skb->data) + MYRI_PAD_LEN);
skb_pull(skb, dev->hard_header_len); skb_pull(skb, dev->hard_header_len);
eth = skb->mac.ethernet; eth = eth_hdr(skb);
#ifdef DEBUG_HEADER #ifdef DEBUG_HEADER
DHDR(("myri_type_trans: ")); DHDR(("myri_type_trans: "));
......
...@@ -547,7 +547,7 @@ static unsigned short plip_type_trans(struct sk_buff *skb, struct net_device *de ...@@ -547,7 +547,7 @@ static unsigned short plip_type_trans(struct sk_buff *skb, struct net_device *de
skb->mac.raw=skb->data; skb->mac.raw=skb->data;
skb_pull(skb,dev->hard_header_len); skb_pull(skb,dev->hard_header_len);
eth= skb->mac.ethernet; eth = eth_hdr(skb);
if(*eth->h_dest&1) if(*eth->h_dest&1)
{ {
......
...@@ -391,7 +391,7 @@ static int pppoe_rcv(struct sk_buff *skb, ...@@ -391,7 +391,7 @@ static int pppoe_rcv(struct sk_buff *skb,
ph = (struct pppoe_hdr *) skb->nh.raw; ph = (struct pppoe_hdr *) skb->nh.raw;
po = get_item((unsigned long) ph->sid, skb->mac.ethernet->h_source); po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source);
if (!po) if (!po)
goto drop; goto drop;
...@@ -440,7 +440,7 @@ static int pppoe_disc_rcv(struct sk_buff *skb, ...@@ -440,7 +440,7 @@ static int pppoe_disc_rcv(struct sk_buff *skb,
if (ph->code != PADT_CODE) if (ph->code != PADT_CODE)
goto abort; goto abort;
po = get_item((unsigned long) ph->sid, skb->mac.ethernet->h_source); po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source);
if (po) { if (po) {
struct sock *sk = po->sk; struct sock *sk = po->sk;
......
...@@ -2148,7 +2148,7 @@ qeth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -2148,7 +2148,7 @@ qeth_type_trans(struct sk_buff *skb, struct net_device *dev)
skb->mac.raw = skb->data; skb->mac.raw = skb->data;
skb_pull(skb, ETH_ALEN * 2 + sizeof (short)); skb_pull(skb, ETH_ALEN * 2 + sizeof (short));
eth = skb->mac.ethernet; eth = eth_hdr(skb);
if (*eth->h_dest & 1) { if (*eth->h_dest & 1) {
if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
......
...@@ -96,11 +96,19 @@ ...@@ -96,11 +96,19 @@
* This is an Ethernet frame header. * This is an Ethernet frame header.
*/ */
struct ethhdr struct ethhdr {
{
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */ unsigned char h_source[ETH_ALEN]; /* source ether addr */
unsigned short h_proto; /* packet type ID field */ unsigned short h_proto; /* packet type ID field */
} __attribute__((packed)); } __attribute__((packed));
#ifdef __KERNEL__
#include <linux/skbuff.h>
static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
{
return (struct ethhdr *)skb->mac.raw;
}
#endif
#endif /* _LINUX_IF_ETHER_H */ #endif /* _LINUX_IF_ETHER_H */
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
/* externally defined structs */ /* externally defined structs */
struct vlan_group; struct vlan_group;
struct net_device; struct net_device;
struct sk_buff;
struct packet_type; struct packet_type;
struct vlan_collection; struct vlan_collection;
struct vlan_dev_info; struct vlan_dev_info;
...@@ -48,6 +47,13 @@ struct vlan_ethhdr { ...@@ -48,6 +47,13 @@ struct vlan_ethhdr {
unsigned short h_vlan_encapsulated_proto; /* packet type ID field (or len) */ unsigned short h_vlan_encapsulated_proto; /* packet type ID field (or len) */
}; };
#include <linux/skbuff.h>
static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb)
{
return (struct vlan_ethhdr *)skb->mac.raw;
}
struct vlan_hdr { struct vlan_hdr {
unsigned short h_vlan_TCI; /* Encapsulates priority and VLAN ID */ unsigned short h_vlan_TCI; /* Encapsulates priority and VLAN ID */
unsigned short h_vlan_encapsulated_proto; /* packet type ID field (or len) */ unsigned short h_vlan_encapsulated_proto; /* packet type ID field (or len) */
...@@ -180,7 +186,7 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, ...@@ -180,7 +186,7 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb,
* This allows the VLAN to have a different MAC than the underlying * This allows the VLAN to have a different MAC than the underlying
* device, and still route correctly. * device, and still route correctly.
*/ */
if (!memcmp(skb->mac.ethernet->h_dest, skb->dev->dev_addr, ETH_ALEN)) if (!memcmp(eth_hdr(skb)->h_dest, skb->dev->dev_addr, ETH_ALEN))
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
break; break;
}; };
......
...@@ -49,6 +49,15 @@ struct ebt_802_3_hdr { ...@@ -49,6 +49,15 @@ struct ebt_802_3_hdr {
} llc; } llc;
}; };
#ifdef __KERNEL__
#include <linux/skbuff.h>
static inline struct ebt_802_3_hdr *ebt_802_3_hdr(const struct sk_buff *skb)
{
return (struct ebt_802_3_hdr *)skb->mac.raw;
}
#endif
struct ebt_802_3_info struct ebt_802_3_info
{ {
uint8_t sap; uint8_t sap;
......
...@@ -219,7 +219,6 @@ struct sk_buff { ...@@ -219,7 +219,6 @@ struct sk_buff {
} nh; } nh;
union { union {
struct ethhdr *ethernet;
unsigned char *raw; unsigned char *raw;
} mac; } mac;
......
...@@ -211,7 +211,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -211,7 +211,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
* This allows the VLAN to have a different MAC than the underlying * This allows the VLAN to have a different MAC than the underlying
* device, and still route correctly. * device, and still route correctly.
*/ */
if (memcmp(skb->mac.ethernet->h_dest, skb->dev->dev_addr, ETH_ALEN) == 0) { if (memcmp(eth_hdr(skb)->h_dest, skb->dev->dev_addr, ETH_ALEN) == 0) {
/* It is for our (changed) MAC-address! */ /* It is for our (changed) MAC-address! */
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
} }
......
...@@ -294,7 +294,7 @@ static inline unsigned short br_type_trans(struct sk_buff *skb, ...@@ -294,7 +294,7 @@ static inline unsigned short br_type_trans(struct sk_buff *skb,
{ {
struct ethhdr *eth; struct ethhdr *eth;
unsigned char *rawp; unsigned char *rawp;
eth = skb->mac.ethernet; eth = eth_hdr(skb);
if (*eth->h_dest & 1) { if (*eth->h_dest & 1) {
if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
......
...@@ -48,7 +48,7 @@ static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) ...@@ -48,7 +48,7 @@ static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb)
/* note: already called with rcu_read_lock (preempt_disabled) */ /* note: already called with rcu_read_lock (preempt_disabled) */
int br_handle_frame_finish(struct sk_buff *skb) int br_handle_frame_finish(struct sk_buff *skb)
{ {
const unsigned char *dest = skb->mac.ethernet->h_dest; const unsigned char *dest = eth_hdr(skb)->h_dest;
struct net_bridge_port *p = skb->dev->br_port; struct net_bridge_port *p = skb->dev->br_port;
struct net_bridge *br = p->br; struct net_bridge *br = p->br;
struct net_bridge_fdb_entry *dst; struct net_bridge_fdb_entry *dst;
...@@ -100,17 +100,17 @@ int br_handle_frame_finish(struct sk_buff *skb) ...@@ -100,17 +100,17 @@ int br_handle_frame_finish(struct sk_buff *skb)
int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb) int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
const unsigned char *dest = skb->mac.ethernet->h_dest; const unsigned char *dest = eth_hdr(skb)->h_dest;
if (p->state == BR_STATE_DISABLED) if (p->state == BR_STATE_DISABLED)
goto err; goto err;
if (skb->mac.ethernet->h_source[0] & 1) if (eth_hdr(skb)->h_source[0] & 1)
goto err; goto err;
if (p->state == BR_STATE_LEARNING || if (p->state == BR_STATE_LEARNING ||
p->state == BR_STATE_FORWARDING) p->state == BR_STATE_FORWARDING)
br_fdb_insert(p->br, p, skb->mac.ethernet->h_source, 0); br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0);
if (p->br->stp_enabled && if (p->br->stp_enabled &&
!memcmp(dest, bridge_ula, 5) && !memcmp(dest, bridge_ula, 5) &&
...@@ -127,7 +127,7 @@ int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb) ...@@ -127,7 +127,7 @@ int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
if (br_should_route_hook(pskb)) if (br_should_route_hook(pskb))
return 0; return 0;
skb = *pskb; skb = *pskb;
dest = skb->mac.ethernet->h_dest; dest = eth_hdr(skb)->h_dest;
} }
if (!memcmp(p->br->dev->dev_addr, dest, ETH_ALEN)) if (!memcmp(p->br->dev->dev_addr, dest, ETH_ALEN))
......
...@@ -255,7 +255,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) ...@@ -255,7 +255,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
1); 1);
return 0; return 0;
} }
memcpy(skb->mac.ethernet->h_dest, dev->dev_addr, memcpy(eth_hdr(skb)->h_dest, dev->dev_addr,
ETH_ALEN); ETH_ALEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
} }
...@@ -412,8 +412,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, ...@@ -412,8 +412,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
__u32 len; __u32 len;
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct nf_bridge_info *nf_bridge; struct nf_bridge_info *nf_bridge;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *) struct vlan_ethhdr *hdr = vlan_eth_hdr(*pskb);
((*pskb)->mac.ethernet);
if (skb->protocol == __constant_htons(ETH_P_IPV6) || IS_VLAN_IPV6) { if (skb->protocol == __constant_htons(ETH_P_IPV6) || IS_VLAN_IPV6) {
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
...@@ -516,7 +515,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) ...@@ -516,7 +515,7 @@ static int br_nf_forward_finish(struct sk_buff *skb)
{ {
struct nf_bridge_info *nf_bridge = skb->nf_bridge; struct nf_bridge_info *nf_bridge = skb->nf_bridge;
struct net_device *in; struct net_device *in;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
#ifdef CONFIG_NETFILTER_DEBUG #ifdef CONFIG_NETFILTER_DEBUG
skb->nf_debug ^= (1 << NF_BR_FORWARD); skb->nf_debug ^= (1 << NF_BR_FORWARD);
...@@ -551,7 +550,7 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb, ...@@ -551,7 +550,7 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb,
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct nf_bridge_info *nf_bridge; struct nf_bridge_info *nf_bridge;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
int pf; int pf;
if (!skb->nf_bridge) if (!skb->nf_bridge)
...@@ -591,7 +590,7 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb, ...@@ -591,7 +590,7 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb,
int (*okfn)(struct sk_buff *)) int (*okfn)(struct sk_buff *))
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
struct net_device **d = (struct net_device **)(skb->cb); struct net_device **d = (struct net_device **)(skb->cb);
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
...@@ -669,7 +668,7 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb, ...@@ -669,7 +668,7 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb,
struct net_device *realindev, *realoutdev; struct net_device *realindev, *realoutdev;
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct nf_bridge_info *nf_bridge; struct nf_bridge_info *nf_bridge;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
int pf; int pf;
if (!skb->nf_bridge) if (!skb->nf_bridge)
...@@ -753,7 +752,7 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, ...@@ -753,7 +752,7 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb,
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge; struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge;
struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
struct net_device *realoutdev = bridge_parent(skb->dev); struct net_device *realoutdev = bridge_parent(skb->dev);
int pf; int pf;
...@@ -848,8 +847,7 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, ...@@ -848,8 +847,7 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb,
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
if (!skb->nf_bridge) { if (!skb->nf_bridge) {
struct vlan_ethhdr *hdr = struct vlan_ethhdr *hdr = vlan_eth_hdr(skb);
(struct vlan_ethhdr *)(skb->mac.ethernet);
if (skb->protocol == __constant_htons(ETH_P_IP) || if (skb->protocol == __constant_htons(ETH_P_IP) ||
IS_VLAN_IP) { IS_VLAN_IP) {
......
...@@ -16,7 +16,7 @@ static int ebt_filter_802_3(const struct sk_buff *skb, const struct net_device * ...@@ -16,7 +16,7 @@ static int ebt_filter_802_3(const struct sk_buff *skb, const struct net_device *
const struct net_device *out, const void *data, unsigned int datalen) const struct net_device *out, const void *data, unsigned int datalen)
{ {
struct ebt_802_3_info *info = (struct ebt_802_3_info *)data; struct ebt_802_3_info *info = (struct ebt_802_3_info *)data;
struct ebt_802_3_hdr *hdr = (struct ebt_802_3_hdr *)skb->mac.ethernet; struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb);
uint16_t type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type; uint16_t type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type;
if (info->bitmask & EBT_802_3_SAP) { if (info->bitmask & EBT_802_3_SAP) {
......
...@@ -72,14 +72,14 @@ static int ebt_mac_wormhash_check_integrity(const struct ebt_mac_wormhash ...@@ -72,14 +72,14 @@ static int ebt_mac_wormhash_check_integrity(const struct ebt_mac_wormhash
static int get_ip_dst(const struct sk_buff *skb, uint32_t *addr) static int get_ip_dst(const struct sk_buff *skb, uint32_t *addr)
{ {
if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_IP)) { if (eth_hdr(skb)->h_proto == htons(ETH_P_IP)) {
struct iphdr _iph, *ih; struct iphdr _iph, *ih;
ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph);
if (ih == NULL) if (ih == NULL)
return -1; return -1;
*addr = ih->daddr; *addr = ih->daddr;
} else if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) { } else if (eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) {
struct arphdr _arph, *ah; struct arphdr _arph, *ah;
uint32_t buf, *bp; uint32_t buf, *bp;
...@@ -100,14 +100,14 @@ static int get_ip_dst(const struct sk_buff *skb, uint32_t *addr) ...@@ -100,14 +100,14 @@ static int get_ip_dst(const struct sk_buff *skb, uint32_t *addr)
static int get_ip_src(const struct sk_buff *skb, uint32_t *addr) static int get_ip_src(const struct sk_buff *skb, uint32_t *addr)
{ {
if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_IP)) { if (eth_hdr(skb)->h_proto == htons(ETH_P_IP)) {
struct iphdr _iph, *ih; struct iphdr _iph, *ih;
ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph);
if (ih == NULL) if (ih == NULL)
return -1; return -1;
*addr = ih->saddr; *addr = ih->saddr;
} else if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) { } else if (eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) {
struct arphdr _arph, *ah; struct arphdr _arph, *ah;
uint32_t buf, *bp; uint32_t buf, *bp;
...@@ -139,7 +139,7 @@ static int ebt_filter_among(const struct sk_buff *skb, ...@@ -139,7 +139,7 @@ static int ebt_filter_among(const struct sk_buff *skb,
wh_src = ebt_among_wh_src(info); wh_src = ebt_among_wh_src(info);
if (wh_src) { if (wh_src) {
smac = skb->mac.ethernet->h_source; smac = eth_hdr(skb)->h_source;
if (get_ip_src(skb, &sip)) if (get_ip_src(skb, &sip))
return EBT_NOMATCH; return EBT_NOMATCH;
if (!(info->bitmask & EBT_AMONG_SRC_NEG)) { if (!(info->bitmask & EBT_AMONG_SRC_NEG)) {
...@@ -154,7 +154,7 @@ static int ebt_filter_among(const struct sk_buff *skb, ...@@ -154,7 +154,7 @@ static int ebt_filter_among(const struct sk_buff *skb,
} }
if (wh_dst) { if (wh_dst) {
dmac = skb->mac.ethernet->h_dest; dmac = eth_hdr(skb)->h_dest;
if (get_ip_dst(skb, &dip)) if (get_ip_dst(skb, &dip))
return EBT_NOMATCH; return EBT_NOMATCH;
if (!(info->bitmask & EBT_AMONG_DST_NEG)) { if (!(info->bitmask & EBT_AMONG_DST_NEG)) {
......
...@@ -30,8 +30,7 @@ static int ebt_target_dnat(struct sk_buff **pskb, unsigned int hooknr, ...@@ -30,8 +30,7 @@ static int ebt_target_dnat(struct sk_buff **pskb, unsigned int hooknr,
kfree_skb(*pskb); kfree_skb(*pskb);
*pskb = nskb; *pskb = nskb;
} }
memcpy(((**pskb).mac.ethernet)->h_dest, info->mac, memcpy(eth_hdr(*pskb)->h_dest, info->mac, ETH_ALEN);
ETH_ALEN * sizeof(unsigned char));
return info->target; return info->target;
} }
......
...@@ -70,13 +70,13 @@ static void ebt_log(const struct sk_buff *skb, const struct net_device *in, ...@@ -70,13 +70,13 @@ static void ebt_log(const struct sk_buff *skb, const struct net_device *in,
out ? out->name : ""); out ? out->name : "");
printk("MAC source = "); printk("MAC source = ");
print_MAC((skb->mac.ethernet)->h_source); print_MAC(eth_hdr(skb)->h_source);
printk("MAC dest = "); printk("MAC dest = ");
print_MAC((skb->mac.ethernet)->h_dest); print_MAC(eth_hdr(skb)->h_dest);
printk("proto = 0x%04x", ntohs(((*skb).mac.ethernet)->h_proto)); printk("proto = 0x%04x", ntohs(eth_hdr(skb)->h_proto));
if ((info->bitmask & EBT_LOG_IP) && skb->mac.ethernet->h_proto == if ((info->bitmask & EBT_LOG_IP) && eth_hdr(skb)->h_proto ==
htons(ETH_P_IP)){ htons(ETH_P_IP)){
struct iphdr _iph, *ih; struct iphdr _iph, *ih;
...@@ -106,8 +106,8 @@ static void ebt_log(const struct sk_buff *skb, const struct net_device *in, ...@@ -106,8 +106,8 @@ static void ebt_log(const struct sk_buff *skb, const struct net_device *in,
} }
if ((info->bitmask & EBT_LOG_ARP) && if ((info->bitmask & EBT_LOG_ARP) &&
((skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) || ((eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) ||
(skb->mac.ethernet->h_proto == __constant_htons(ETH_P_RARP)))) { (eth_hdr(skb)->h_proto == htons(ETH_P_RARP)))) {
struct arphdr _arph, *ah; struct arphdr _arph, *ah;
ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph);
......
...@@ -32,11 +32,10 @@ static int ebt_target_redirect(struct sk_buff **pskb, unsigned int hooknr, ...@@ -32,11 +32,10 @@ static int ebt_target_redirect(struct sk_buff **pskb, unsigned int hooknr,
*pskb = nskb; *pskb = nskb;
} }
if (hooknr != NF_BR_BROUTING) if (hooknr != NF_BR_BROUTING)
memcpy((**pskb).mac.ethernet->h_dest, memcpy(eth_hdr(*pskb)->h_dest,
in->br_port->br->dev->dev_addr, ETH_ALEN); in->br_port->br->dev->dev_addr, ETH_ALEN);
else else
memcpy((**pskb).mac.ethernet->h_dest, memcpy(eth_hdr(*pskb)->h_dest, in->dev_addr, ETH_ALEN);
in->dev_addr, ETH_ALEN);
(*pskb)->pkt_type = PACKET_HOST; (*pskb)->pkt_type = PACKET_HOST;
return info->target; return info->target;
} }
......
...@@ -30,8 +30,7 @@ static int ebt_target_snat(struct sk_buff **pskb, unsigned int hooknr, ...@@ -30,8 +30,7 @@ static int ebt_target_snat(struct sk_buff **pskb, unsigned int hooknr,
kfree_skb(*pskb); kfree_skb(*pskb);
*pskb = nskb; *pskb = nskb;
} }
memcpy(((**pskb).mac.ethernet)->h_source, info->mac, memcpy(eth_hdr(*pskb)->h_source, info->mac, ETH_ALEN);
ETH_ALEN * sizeof(unsigned char));
return info->target; return info->target;
} }
......
...@@ -190,7 +190,7 @@ unsigned int ebt_do_table (unsigned int hook, struct sk_buff **pskb, ...@@ -190,7 +190,7 @@ unsigned int ebt_do_table (unsigned int hook, struct sk_buff **pskb,
base = private->entries; base = private->entries;
i = 0; i = 0;
while (i < nentries) { while (i < nentries) {
if (ebt_basic_match(point, (**pskb).mac.ethernet, in, out)) if (ebt_basic_match(point, eth_hdr(*pskb), in, out))
goto letscontinue; goto letscontinue;
if (EBT_MATCH_ITERATE(point, ebt_do_match, *pskb, in, out) != 0) if (EBT_MATCH_ITERATE(point, ebt_do_match, *pskb, in, out) != 0)
......
...@@ -450,12 +450,12 @@ int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg) ...@@ -450,12 +450,12 @@ int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg)
*/ */
#define ETH_DIVERT_FRAME(skb) \ #define ETH_DIVERT_FRAME(skb) \
memcpy(skb->mac.ethernet, skb->dev->dev_addr, ETH_ALEN); \ memcpy(eth_hdr(skb), skb->dev->dev_addr, ETH_ALEN); \
skb->pkt_type=PACKET_HOST skb->pkt_type=PACKET_HOST
void divert_frame(struct sk_buff *skb) void divert_frame(struct sk_buff *skb)
{ {
struct ethhdr *eth = skb->mac.ethernet; struct ethhdr *eth = eth_hdr(skb);
struct iphdr *iph; struct iphdr *iph;
struct tcphdr *tcph; struct tcphdr *tcph;
struct udphdr *udph; struct udphdr *udph;
......
...@@ -378,7 +378,7 @@ int netpoll_rx(struct sk_buff *skb) ...@@ -378,7 +378,7 @@ int netpoll_rx(struct sk_buff *skb)
return 1; return 1;
} }
proto = ntohs(skb->mac.ethernet->h_proto); proto = ntohs(eth_hdr(skb)->h_proto);
if (proto != ETH_P_IP) if (proto != ETH_P_IP)
goto out; goto out;
if (skb->pkt_type == PACKET_OTHERHOST) if (skb->pkt_type == PACKET_OTHERHOST)
......
...@@ -399,7 +399,7 @@ int dn_neigh_router_hello(struct sk_buff *skb) ...@@ -399,7 +399,7 @@ int dn_neigh_router_hello(struct sk_buff *skb)
neigh->updated = jiffies; neigh->updated = jiffies;
if (neigh->dev->type == ARPHRD_ETHER) if (neigh->dev->type == ARPHRD_ETHER)
memcpy(neigh->ha, &skb->mac.ethernet->h_source, ETH_ALEN); memcpy(neigh->ha, &eth_hdr(skb)->h_source, ETH_ALEN);
dn->blksize = dn_ntohs(msg->blksize); dn->blksize = dn_ntohs(msg->blksize);
dn->priority = msg->priority; dn->priority = msg->priority;
...@@ -455,7 +455,7 @@ int dn_neigh_endnode_hello(struct sk_buff *skb) ...@@ -455,7 +455,7 @@ int dn_neigh_endnode_hello(struct sk_buff *skb)
neigh->updated = jiffies; neigh->updated = jiffies;
if (neigh->dev->type == ARPHRD_ETHER) if (neigh->dev->type == ARPHRD_ETHER)
memcpy(neigh->ha, &skb->mac.ethernet->h_source, ETH_ALEN); memcpy(neigh->ha, &eth_hdr(skb)->h_source, ETH_ALEN);
dn->flags &= ~(DN_NDFLAG_R1 | DN_NDFLAG_R2); dn->flags &= ~(DN_NDFLAG_R1 | DN_NDFLAG_R2);
dn->blksize = dn_ntohs(msg->blksize); dn->blksize = dn_ntohs(msg->blksize);
dn->priority = 0; dn->priority = 0;
......
...@@ -163,7 +163,7 @@ unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -163,7 +163,7 @@ unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev)
skb->mac.raw=skb->data; skb->mac.raw=skb->data;
skb_pull(skb,ETH_HLEN); skb_pull(skb,ETH_HLEN);
eth= skb->mac.ethernet; eth = eth_hdr(skb);
skb->input_dev = dev; skb->input_dev = dev;
if(*eth->h_dest&1) if(*eth->h_dest&1)
...@@ -210,7 +210,7 @@ unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -210,7 +210,7 @@ unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev)
int eth_header_parse(struct sk_buff *skb, unsigned char *haddr) int eth_header_parse(struct sk_buff *skb, unsigned char *haddr)
{ {
struct ethhdr *eth = skb->mac.ethernet; struct ethhdr *eth = eth_hdr(skb);
memcpy(haddr, eth->h_source, ETH_ALEN); memcpy(haddr, eth->h_source, ETH_ALEN);
return ETH_ALEN; return ETH_ALEN;
} }
......
...@@ -33,7 +33,7 @@ match(const struct sk_buff *skb, ...@@ -33,7 +33,7 @@ match(const struct sk_buff *skb,
return (skb->mac.raw >= skb->head return (skb->mac.raw >= skb->head
&& (skb->mac.raw + ETH_HLEN) <= skb->data && (skb->mac.raw + ETH_HLEN) <= skb->data
/* If so, compare... */ /* If so, compare... */
&& ((memcmp(skb->mac.ethernet->h_source, info->srcaddr, ETH_ALEN) && ((memcmp(eth_hdr(skb)->h_source, info->srcaddr, ETH_ALEN)
== 0) ^ info->invert)); == 0) ^ info->invert));
} }
......
...@@ -41,10 +41,10 @@ match(const struct sk_buff *skb, ...@@ -41,10 +41,10 @@ match(const struct sk_buff *skb,
memset(eui64, 0, sizeof(eui64)); memset(eui64, 0, sizeof(eui64));
if (skb->mac.ethernet->h_proto == ntohs(ETH_P_IPV6)) { if (eth_hdr(skb)->h_proto == ntohs(ETH_P_IPV6)) {
if (skb->nh.ipv6h->version == 0x6) { if (skb->nh.ipv6h->version == 0x6) {
memcpy(eui64, skb->mac.ethernet->h_source, 3); memcpy(eui64, eth_hdr(skb)->h_source, 3);
memcpy(eui64 + 5, skb->mac.ethernet->h_source + 3, 3); memcpy(eui64 + 5, eth_hdr(skb)->h_source + 3, 3);
eui64[3]=0xff; eui64[3]=0xff;
eui64[4]=0xfe; eui64[4]=0xfe;
eui64[0] |= 0x02; eui64[0] |= 0x02;
......
...@@ -35,7 +35,7 @@ match(const struct sk_buff *skb, ...@@ -35,7 +35,7 @@ match(const struct sk_buff *skb,
return (skb->mac.raw >= skb->head return (skb->mac.raw >= skb->head
&& (skb->mac.raw + ETH_HLEN) <= skb->data && (skb->mac.raw + ETH_HLEN) <= skb->data
/* If so, compare... */ /* If so, compare... */
&& ((memcmp(skb->mac.ethernet->h_source, info->srcaddr, ETH_ALEN) && ((memcmp(eth_hdr(skb)->h_source, info->srcaddr, ETH_ALEN)
== 0) ^ info->invert)); == 0) ^ info->invert));
} }
......
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