[SK_BUFF]: Introduce ip_hdr(), remove skb->nh.iph

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Arnaldo Carvalho de Melo 2007-04-20 22:47:35 -07:00 committed by David S. Miller
parent e023dd6437
commit eddc9ec53b
132 changed files with 565 additions and 564 deletions

View File

@ -1668,7 +1668,7 @@ static int ether1394_tx (struct sk_buff *skb, struct net_device *dev)
if (memcmp(eth->h_dest, dev->broadcast, ETH1394_ALEN) == 0 || if (memcmp(eth->h_dest, dev->broadcast, ETH1394_ALEN) == 0 ||
proto == htons(ETH_P_ARP) || proto == htons(ETH_P_ARP) ||
(proto == htons(ETH_P_IP) && (proto == htons(ETH_P_IP) &&
IN_MULTICAST(ntohl(skb->nh.iph->daddr)))) { IN_MULTICAST(ntohl(ip_hdr(skb)->daddr)))) {
tx_type = ETH1394_GASP; tx_type = ETH1394_GASP;
dest_node = LOCAL_BUS | ALL_NODES; dest_node = LOCAL_BUS | ALL_NODES;
max_payload = priv->bc_maxpayload - ETHER1394_GASP_OVERHEAD; max_payload = priv->bc_maxpayload - ETHER1394_GASP_OVERHEAD;

View File

@ -806,7 +806,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
if (mss) if (mss)
flags |= LargeSend | ((mss & MSSMask) << MSSShift); flags |= LargeSend | ((mss & MSSMask) << MSSShift);
else if (skb->ip_summed == CHECKSUM_PARTIAL) { else if (skb->ip_summed == CHECKSUM_PARTIAL) {
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = ip_hdr(skb);
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
flags |= IPCS | TCPCS; flags |= IPCS | TCPCS;
else if (ip->protocol == IPPROTO_UDP) else if (ip->protocol == IPPROTO_UDP)
@ -825,7 +825,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
u32 first_len, first_eor; u32 first_len, first_eor;
dma_addr_t first_mapping; dma_addr_t first_mapping;
int frag, first_entry = entry; int frag, first_entry = entry;
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = ip_hdr(skb);
/* We must give this initial chunk to the device last. /* We must give this initial chunk to the device last.
* Otherwise we could race with the device. * Otherwise we could race with the device.

View File

@ -1294,17 +1294,18 @@ static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb,
} }
if (skb->protocol == ntohs(ETH_P_IP)) { if (skb->protocol == ntohs(ETH_P_IP)) {
skb->nh.iph->tot_len = 0; struct iphdr *iph = ip_hdr(skb);
skb->nh.iph->check = 0;
skb->h.th->check = iph->tot_len = 0;
~csum_tcpudp_magic(skb->nh.iph->saddr, iph->check = 0;
skb->nh.iph->daddr, 0, skb->h.th->check = ~csum_tcpudp_magic(iph->saddr,
IPPROTO_TCP, 0); iph->daddr, 0,
IPPROTO_TCP, 0);
ipofst = skb_network_offset(skb); ipofst = skb_network_offset(skb);
if (ipofst != ENET_HEADER_SIZE) /* 802.3 frame */ if (ipofst != ENET_HEADER_SIZE) /* 802.3 frame */
tso->tsopl |= 1 << TSO_PARAM_ETHTYPE_SHIFT; tso->tsopl |= 1 << TSO_PARAM_ETHTYPE_SHIFT;
tso->tsopl |= (skb->nh.iph->ihl & tso->tsopl |= (iph->ihl &
CSUM_PARAM_IPHL_MASK) << CSUM_PARAM_IPHL_SHIFT; CSUM_PARAM_IPHL_MASK) << CSUM_PARAM_IPHL_SHIFT;
tso->tsopl |= ((skb->h.th->doff << 2) & tso->tsopl |= ((skb->h.th->doff << 2) &
TSO_PARAM_TCPHDRLEN_MASK) << TSO_PARAM_TCPHDRLEN_SHIFT; TSO_PARAM_TCPHDRLEN_MASK) << TSO_PARAM_TCPHDRLEN_SHIFT;

View File

@ -4513,6 +4513,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
if ((mss = skb_shinfo(skb)->gso_size) && if ((mss = skb_shinfo(skb)->gso_size) &&
(skb->len > (bp->dev->mtu + ETH_HLEN))) { (skb->len > (bp->dev->mtu + ETH_HLEN))) {
u32 tcp_opt_len, ip_tcp_len; u32 tcp_opt_len, ip_tcp_len;
struct iphdr *iph;
if (skb_header_cloned(skb) && if (skb_header_cloned(skb) &&
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
@ -4529,16 +4530,15 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
} }
ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
skb->nh.iph->check = 0; iph = ip_hdr(skb);
skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); iph->check = 0;
skb->h.th->check = iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
~csum_tcpudp_magic(skb->nh.iph->saddr, skb->h.th->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
skb->nh.iph->daddr, 0, IPPROTO_TCP, 0);
0, IPPROTO_TCP, 0);
if (tcp_opt_len || (skb->nh.iph->ihl > 5)) { if (tcp_opt_len || (iph->ihl > 5)) {
vlan_tag_flags |= ((skb->nh.iph->ihl - 5) + vlan_tag_flags |= ((iph->ihl - 5) +
(tcp_opt_len >> 2)) << 8; (tcp_opt_len >> 2)) << 8;
} }
} }
else else

View File

@ -112,7 +112,7 @@ static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb)
/* Forward declaration */ /* Forward declaration */
static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]); static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]);
static inline u8 _simple_hash(u8 *hash_start, int hash_size) static inline u8 _simple_hash(const u8 *hash_start, int hash_size)
{ {
int i; int i;
u8 hash = 0; u8 hash = 0;
@ -1268,7 +1268,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
int hash_size = 0; int hash_size = 0;
int do_tx_balance = 1; int do_tx_balance = 1;
u32 hash_index = 0; u32 hash_index = 0;
u8 *hash_start = NULL; const u8 *hash_start = NULL;
int res = 1; int res = 1;
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
@ -1285,15 +1285,18 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
} }
switch (ntohs(skb->protocol)) { switch (ntohs(skb->protocol)) {
case ETH_P_IP: case ETH_P_IP: {
const struct iphdr *iph = ip_hdr(skb);
if ((memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) || if ((memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) ||
(skb->nh.iph->daddr == ip_bcast) || (iph->daddr == ip_bcast) ||
(skb->nh.iph->protocol == IPPROTO_IGMP)) { (iph->protocol == IPPROTO_IGMP)) {
do_tx_balance = 0; do_tx_balance = 0;
break; break;
} }
hash_start = (char*)&(skb->nh.iph->daddr); hash_start = (char *)&(iph->daddr);
hash_size = sizeof(skb->nh.iph->daddr); hash_size = sizeof(iph->daddr);
}
break; break;
case ETH_P_IPV6: case ETH_P_IPV6:
if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) { if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) {

View File

@ -3476,7 +3476,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb,
struct net_device *bond_dev, int count) struct net_device *bond_dev, int count)
{ {
struct ethhdr *data = (struct ethhdr *)skb->data; struct ethhdr *data = (struct ethhdr *)skb->data;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
u16 *layer4hdr = (u16 *)((u32 *)iph + iph->ihl); u16 *layer4hdr = (u16 *)((u32 *)iph + iph->ihl);
int layer4_xor = 0; int layer4_xor = 0;

View File

@ -1871,7 +1871,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
hdr = (struct cpl_tx_pkt_lso *)skb_push(skb, sizeof(*hdr)); hdr = (struct cpl_tx_pkt_lso *)skb_push(skb, sizeof(*hdr));
hdr->opcode = CPL_TX_PKT_LSO; hdr->opcode = CPL_TX_PKT_LSO;
hdr->ip_csum_dis = hdr->l4_csum_dis = 0; hdr->ip_csum_dis = hdr->l4_csum_dis = 0;
hdr->ip_hdr_words = skb->nh.iph->ihl; hdr->ip_hdr_words = ip_hdr(skb)->ihl;
hdr->tcp_hdr_words = skb->h.th->doff; hdr->tcp_hdr_words = skb->h.th->doff;
hdr->eth_type_mss = htons(MK_ETH_TYPE_MSS(eth_type, hdr->eth_type_mss = htons(MK_ETH_TYPE_MSS(eth_type,
skb_shinfo(skb)->gso_size)); skb_shinfo(skb)->gso_size));
@ -1912,7 +1912,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (!(adapter->flags & UDP_CSUM_CAPABLE) && if (!(adapter->flags & UDP_CSUM_CAPABLE) &&
skb->ip_summed == CHECKSUM_PARTIAL && skb->ip_summed == CHECKSUM_PARTIAL &&
skb->nh.iph->protocol == IPPROTO_UDP) { ip_hdr(skb)->protocol == IPPROTO_UDP) {
if (unlikely(skb_checksum_help(skb))) { if (unlikely(skb_checksum_help(skb))) {
pr_debug("%s: unable to do udp checksum\n", dev->name); pr_debug("%s: unable to do udp checksum\n", dev->name);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);

View File

@ -900,7 +900,7 @@ static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
eth_type = skb_network_offset(skb) == ETH_HLEN ? eth_type = skb_network_offset(skb) == ETH_HLEN ?
CPL_ETH_II : CPL_ETH_II_VLAN; CPL_ETH_II : CPL_ETH_II_VLAN;
tso_info |= V_LSO_ETH_TYPE(eth_type) | tso_info |= V_LSO_ETH_TYPE(eth_type) |
V_LSO_IPHDR_WORDS(skb->nh.iph->ihl) | V_LSO_IPHDR_WORDS(ip_hdr(skb)->ihl) |
V_LSO_TCPHDR_WORDS(skb->h.th->doff); V_LSO_TCPHDR_WORDS(skb->h.th->doff);
hdr->lso_info = htonl(tso_info); hdr->lso_info = htonl(tso_info);
flits = 3; flits = 3;

View File

@ -2890,14 +2890,12 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
mss = skb_shinfo(skb)->gso_size; mss = skb_shinfo(skb)->gso_size;
if (skb->protocol == htons(ETH_P_IP)) { if (skb->protocol == htons(ETH_P_IP)) {
skb->nh.iph->tot_len = 0; struct iphdr *iph = ip_hdr(skb);
skb->nh.iph->check = 0; iph->tot_len = 0;
skb->h.th->check = iph->check = 0;
~csum_tcpudp_magic(skb->nh.iph->saddr, skb->h.th->check = ~csum_tcpudp_magic(iph->saddr,
skb->nh.iph->daddr, iph->daddr, 0,
0, IPPROTO_TCP, 0);
IPPROTO_TCP,
0);
cmd_length = E1000_TXD_CMD_IP; cmd_length = E1000_TXD_CMD_IP;
ipcse = skb->h.raw - skb->data - 1; ipcse = skb->h.raw - skb->data - 1;
} else if (skb->protocol == htons(ETH_P_IPV6)) { } else if (skb->protocol == htons(ETH_P_IPV6)) {
@ -2911,7 +2909,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
ipcse = 0; ipcse = 0;
} }
ipcss = skb_network_offset(skb); ipcss = skb_network_offset(skb);
ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data; ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
tucss = skb->h.raw - skb->data; tucss = skb->h.raw - skb->data;
tucso = (void *)&(skb->h.th->check) - (void *)skb->data; tucso = (void *)&(skb->h.th->check) - (void *)skb->data;
tucse = 0; tucse = 0;

View File

@ -1262,7 +1262,7 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
static inline void write_ip_start_end(struct ehea_swqe *swqe, static inline void write_ip_start_end(struct ehea_swqe *swqe,
const struct sk_buff *skb) const struct sk_buff *skb)
{ {
swqe->ip_start = (u8)(((u64)skb->nh.iph) - ((u64)skb->data)); swqe->ip_start = skb_network_offset(skb);
swqe->ip_end = (u8)(swqe->ip_start + ip_hdrlen(skb) - 1); swqe->ip_end = (u8)(swqe->ip_start + ip_hdrlen(skb) - 1);
} }
@ -1688,6 +1688,7 @@ static void ehea_xmit2(struct sk_buff *skb, struct net_device *dev,
struct ehea_swqe *swqe, u32 lkey) struct ehea_swqe *swqe, u32 lkey)
{ {
if (skb->protocol == htons(ETH_P_IP)) { if (skb->protocol == htons(ETH_P_IP)) {
const struct iphdr *iph = ip_hdr(skb);
/* IPv4 */ /* IPv4 */
swqe->tx_control |= EHEA_SWQE_CRC swqe->tx_control |= EHEA_SWQE_CRC
| EHEA_SWQE_IP_CHECKSUM | EHEA_SWQE_IP_CHECKSUM
@ -1697,15 +1698,15 @@ static void ehea_xmit2(struct sk_buff *skb, struct net_device *dev,
write_ip_start_end(swqe, skb); write_ip_start_end(swqe, skb);
if (skb->nh.iph->protocol == IPPROTO_UDP) { if (iph->protocol == IPPROTO_UDP) {
if ((skb->nh.iph->frag_off & IP_MF) || if ((iph->frag_off & IP_MF) ||
(skb->nh.iph->frag_off & IP_OFFSET)) (iph->frag_off & IP_OFFSET))
/* IP fragment, so don't change cs */ /* IP fragment, so don't change cs */
swqe->tx_control &= ~EHEA_SWQE_TCP_CHECKSUM; swqe->tx_control &= ~EHEA_SWQE_TCP_CHECKSUM;
else else
write_udp_offset_end(swqe, skb); write_udp_offset_end(swqe, skb);
} else if (skb->nh.iph->protocol == IPPROTO_TCP) { } else if (iph->protocol == IPPROTO_TCP) {
write_tcp_offset_end(swqe, skb); write_tcp_offset_end(swqe, skb);
} }
@ -1731,10 +1732,11 @@ static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev,
int i; int i;
if (skb->protocol == htons(ETH_P_IP)) { if (skb->protocol == htons(ETH_P_IP)) {
const struct iphdr *iph = ip_hdr(skb);
/* IPv4 */ /* IPv4 */
write_ip_start_end(swqe, skb); write_ip_start_end(swqe, skb);
if (skb->nh.iph->protocol == IPPROTO_TCP) { if (iph->protocol == IPPROTO_TCP) {
swqe->tx_control |= EHEA_SWQE_CRC swqe->tx_control |= EHEA_SWQE_CRC
| EHEA_SWQE_IP_CHECKSUM | EHEA_SWQE_IP_CHECKSUM
| EHEA_SWQE_TCP_CHECKSUM | EHEA_SWQE_TCP_CHECKSUM
@ -1742,9 +1744,9 @@ static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev,
write_tcp_offset_end(swqe, skb); write_tcp_offset_end(swqe, skb);
} else if (skb->nh.iph->protocol == IPPROTO_UDP) { } else if (iph->protocol == IPPROTO_UDP) {
if ((skb->nh.iph->frag_off & IP_MF) || if ((iph->frag_off & IP_MF) ||
(skb->nh.iph->frag_off & IP_OFFSET)) (iph->frag_off & IP_OFFSET))
/* IP fragment, so don't change cs */ /* IP fragment, so don't change cs */
swqe->tx_control |= EHEA_SWQE_CRC swqe->tx_control |= EHEA_SWQE_CRC
| EHEA_SWQE_IMM_DATA_PRESENT; | EHEA_SWQE_IMM_DATA_PRESENT;

View File

@ -942,7 +942,7 @@ static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb)
/* Tell the controller what the protocol is */ /* Tell the controller what the protocol is */
/* And provide the already calculated phcs */ /* And provide the already calculated phcs */
if (skb->nh.iph->protocol == IPPROTO_UDP) { if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
flags |= TXFCB_UDP; flags |= TXFCB_UDP;
fcb->phcs = skb->h.uh->check; fcb->phcs = skb->h.uh->check;
} else } else

View File

@ -1393,9 +1393,9 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev)
* manually. * manually.
*/ */
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
int proto = ntohs(skb->nh.iph->protocol); const struct iphdr *ih = ip_hdr(skb);
const int proto = ntohs(ih->protocol);
unsigned int csoff; unsigned int csoff;
struct iphdr *ih = skb->nh.iph;
uint32_t csum, ehsum; uint32_t csum, ehsum;
uint16_t *eh; uint16_t *eh;

View File

@ -1182,6 +1182,8 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
if (likely(skb_is_gso(skb))) { if (likely(skb_is_gso(skb))) {
struct ixgb_buffer *buffer_info; struct ixgb_buffer *buffer_info;
struct iphdr *iph;
if (skb_header_cloned(skb)) { if (skb_header_cloned(skb)) {
err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
if (err) if (err)
@ -1190,13 +1192,13 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
mss = skb_shinfo(skb)->gso_size; mss = skb_shinfo(skb)->gso_size;
skb->nh.iph->tot_len = 0; iph = ip_hdr(skb);
skb->nh.iph->check = 0; iph->tot_len = 0;
skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, iph->check = 0;
skb->nh.iph->daddr, skb->h.th->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
0, IPPROTO_TCP, 0); 0, IPPROTO_TCP, 0);
ipcss = skb_network_offset(skb); ipcss = skb_network_offset(skb);
ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data; ipcso = (void *)&(iph->check) - (void *)skb->data;
ipcse = skb->h.raw - skb->data - 1; ipcse = skb->h.raw - skb->data - 1;
tucss = skb->h.raw - skb->data; tucss = skb->h.raw - skb->data;
tucso = (void *)&(skb->h.th->check) - (void *)skb->data; tucso = (void *)&(skb->h.th->check) - (void *)skb->data;

View File

@ -75,7 +75,7 @@ static DEFINE_PER_CPU(struct pcpu_lstats, pcpu_lstats);
#ifdef LOOPBACK_TSO #ifdef LOOPBACK_TSO
static void emulate_large_send_offload(struct sk_buff *skb) static void emulate_large_send_offload(struct sk_buff *skb)
{ {
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct tcphdr *th = (struct tcphdr *)(skb_network_header(skb) + struct tcphdr *th = (struct tcphdr *)(skb_network_header(skb) +
(iph->ihl * 4)); (iph->ihl * 4));
unsigned int doffset = (iph->ihl + th->doff) * 4; unsigned int doffset = (iph->ihl + th->doff) * 4;
@ -93,7 +93,7 @@ static void emulate_large_send_offload(struct sk_buff *skb)
skb_reserve(nskb, 32); skb_reserve(nskb, 32);
skb_set_mac_header(nskb, -ETH_HLEN); skb_set_mac_header(nskb, -ETH_HLEN);
skb_reset_network_header(nskb); skb_reset_network_header(nskb);
iph = nskb->nh.iph; iph = ip_hdr(nskb);
memcpy(nskb->data, skb_network_header(skb), doffset); memcpy(nskb->data, skb_network_header(skb), doffset);
if (skb_copy_bits(skb, if (skb_copy_bits(skb,
doffset + offset, doffset + offset,
@ -145,7 +145,7 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
#ifdef LOOPBACK_TSO #ifdef LOOPBACK_TSO
if (skb_is_gso(skb)) { if (skb_is_gso(skb)) {
BUG_ON(skb->protocol != htons(ETH_P_IP)); BUG_ON(skb->protocol != htons(ETH_P_IP));
BUG_ON(skb->nh.iph->protocol != IPPROTO_TCP); BUG_ON(ip_hdr(skb)->protocol != IPPROTO_TCP);
emulate_large_send_offload(skb); emulate_large_send_offload(skb);
return 0; return 0;

View File

@ -1161,9 +1161,9 @@ static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp,
cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM | cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM |
ETH_GEN_IP_V_4_CHECKSUM | ETH_GEN_IP_V_4_CHECKSUM |
skb->nh.iph->ihl << ETH_TX_IHL_SHIFT; ip_hdr(skb)->ihl << ETH_TX_IHL_SHIFT;
switch (skb->nh.iph->protocol) { switch (ip_hdr(skb)->protocol) {
case IPPROTO_UDP: case IPPROTO_UDP:
cmd_sts |= ETH_UDP_FRAME; cmd_sts |= ETH_UDP_FRAME;
desc->l4i_chk = skb->h.uh->check; desc->l4i_chk = skb->h.uh->check;

View File

@ -378,9 +378,9 @@ void netxen_tso_check(struct netxen_adapter *adapter,
skb->h.th->doff * 4); skb->h.th->doff * 4);
netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
} else if (skb->ip_summed == CHECKSUM_PARTIAL) { } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
if (skb->nh.iph->protocol == IPPROTO_TCP) { if (ip_hdr(skb)->protocol == IPPROTO_TCP) {
netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT); netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
} else if (skb->nh.iph->protocol == IPPROTO_UDP) { } else if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT); netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT);
} else { } else {
return; return;

View File

@ -1156,9 +1156,9 @@ again:
extsts = 0; extsts = 0;
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
extsts |= EXTSTS_IPPKT; extsts |= EXTSTS_IPPKT;
if (IPPROTO_TCP == skb->nh.iph->protocol) if (IPPROTO_TCP == ip_hdr(skb)->protocol)
extsts |= EXTSTS_TCPPKT; extsts |= EXTSTS_TCPPKT;
else if (IPPROTO_UDP == skb->nh.iph->protocol) else if (IPPROTO_UDP == ip_hdr(skb)->protocol)
extsts |= EXTSTS_UDPPKT; extsts |= EXTSTS_UDPPKT;
} }

View File

@ -731,7 +731,7 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
const unsigned char *nh = skb_network_header(skb); const unsigned char *nh = skb_network_header(skb);
switch (skb->nh.iph->protocol) { switch (ip_hdr(skb)->protocol) {
case IPPROTO_TCP: case IPPROTO_TCP:
dflags |= XCT_MACTX_CSUM_TCP; dflags |= XCT_MACTX_CSUM_TCP;
dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2); dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2);

View File

@ -2284,7 +2284,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
return LargeSend | ((mss & MSSMask) << MSSShift); return LargeSend | ((mss & MSSMask) << MSSShift);
} }
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = ip_hdr(skb);
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
return IPCS | TCPCS; return IPCS | TCPCS;

View File

@ -1428,7 +1428,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
tcpsum |= offset + skb->csum_offset; /* sum write */ tcpsum |= offset + skb->csum_offset; /* sum write */
ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
if (skb->nh.iph->protocol == IPPROTO_UDP) if (ip_hdr(skb)->protocol == IPPROTO_UDP)
ctrl |= UDPTCP; ctrl |= UDPTCP;
if (tcpsum != sky2->tx_tcpsum) { if (tcpsum != sky2->tx_tcpsum) {

View File

@ -720,7 +720,7 @@ spider_net_prepare_tx_descr(struct spider_net_card *card,
spin_unlock_irqrestore(&chain->lock, flags); spin_unlock_irqrestore(&chain->lock, flags);
if (skb->protocol == htons(ETH_P_IP) && skb->ip_summed == CHECKSUM_PARTIAL) if (skb->protocol == htons(ETH_P_IP) && skb->ip_summed == CHECKSUM_PARTIAL)
switch (skb->nh.iph->protocol) { switch (ip_hdr(skb)->protocol) {
case IPPROTO_TCP: case IPPROTO_TCP:
hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_TCP; hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_TCP;
break; break;

View File

@ -3909,12 +3909,13 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
mss |= (skb_headlen(skb) - ETH_HLEN) << 9; mss |= (skb_headlen(skb) - ETH_HLEN) << 9;
else { else {
struct iphdr *iph = ip_hdr(skb);
tcp_opt_len = ((skb->h.th->doff - 5) * 4); tcp_opt_len = ((skb->h.th->doff - 5) * 4);
ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
skb->nh.iph->check = 0; iph->check = 0;
skb->nh.iph->tot_len = htons(mss + ip_tcp_len + iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
tcp_opt_len);
mss |= (ip_tcp_len + tcp_opt_len) << 9; mss |= (ip_tcp_len + tcp_opt_len) << 9;
} }
@ -4055,6 +4056,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
mss = 0; mss = 0;
if (skb->len > (tp->dev->mtu + ETH_HLEN) && if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
(mss = skb_shinfo(skb)->gso_size) != 0) { (mss = skb_shinfo(skb)->gso_size) != 0) {
struct iphdr *iph;
int tcp_opt_len, ip_tcp_len, hdr_len; int tcp_opt_len, ip_tcp_len, hdr_len;
if (skb_header_cloned(skb) && if (skb_header_cloned(skb) &&
@ -4074,34 +4076,32 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
base_flags |= (TXD_FLAG_CPU_PRE_DMA | base_flags |= (TXD_FLAG_CPU_PRE_DMA |
TXD_FLAG_CPU_POST_DMA); TXD_FLAG_CPU_POST_DMA);
skb->nh.iph->check = 0; iph = ip_hdr(skb);
skb->nh.iph->tot_len = htons(mss + hdr_len); iph->check = 0;
iph->tot_len = htons(mss + hdr_len);
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
skb->h.th->check = 0; skb->h.th->check = 0;
base_flags &= ~TXD_FLAG_TCPUDP_CSUM; base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
} }
else { else {
skb->h.th->check = skb->h.th->check = ~csum_tcpudp_magic(iph->saddr,
~csum_tcpudp_magic(skb->nh.iph->saddr, iph->daddr, 0,
skb->nh.iph->daddr, IPPROTO_TCP, 0);
0, IPPROTO_TCP, 0);
} }
if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) || if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) { (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
if (tcp_opt_len || skb->nh.iph->ihl > 5) { if (tcp_opt_len || iph->ihl > 5) {
int tsflags; int tsflags;
tsflags = ((skb->nh.iph->ihl - 5) + tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
(tcp_opt_len >> 2));
mss |= (tsflags << 11); mss |= (tsflags << 11);
} }
} else { } else {
if (tcp_opt_len || skb->nh.iph->ihl > 5) { if (tcp_opt_len || iph->ihl > 5) {
int tsflags; int tsflags;
tsflags = ((skb->nh.iph->ihl - 5) + tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
(tcp_opt_len >> 2));
base_flags |= tsflags << 12; base_flags |= tsflags << 12;
} }
} }

View File

@ -2006,7 +2006,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev)
*/ */
if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM) if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM)
&& (skb->ip_summed == CHECKSUM_PARTIAL)) { && (skb->ip_summed == CHECKSUM_PARTIAL)) {
struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = ip_hdr(skb);
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
td_ptr->tdesc1.TCR |= TCR0_TCPCK; td_ptr->tdesc1.TCR |= TCR0_TCPCK;
else if (ip->protocol == IPPROTO_UDP) else if (ip->protocol == IPPROTO_UDP)

View File

@ -3820,18 +3820,20 @@ qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
return card->info.is_multicast_different & return card->info.is_multicast_different &
(card->qdio.no_out_queues - 1); (card->qdio.no_out_queues - 1);
if (card->qdio.do_prio_queueing && (ipv == 4)) { if (card->qdio.do_prio_queueing && (ipv == 4)) {
const u8 tos = ip_hdr(skb)->tos;
if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_TOS){ if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_TOS){
if (skb->nh.iph->tos & IP_TOS_NOTIMPORTANT) if (tos & IP_TOS_NOTIMPORTANT)
return 3; return 3;
if (skb->nh.iph->tos & IP_TOS_HIGHRELIABILITY) if (tos & IP_TOS_HIGHRELIABILITY)
return 2; return 2;
if (skb->nh.iph->tos & IP_TOS_HIGHTHROUGHPUT) if (tos & IP_TOS_HIGHTHROUGHPUT)
return 1; return 1;
if (skb->nh.iph->tos & IP_TOS_LOWDELAY) if (tos & IP_TOS_LOWDELAY)
return 0; return 0;
} }
if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_PREC) if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_PREC)
return 3 - (skb->nh.iph->tos >> 6); return 3 - (tos >> 6);
} else if (card->qdio.do_prio_queueing && (ipv == 6)) { } else if (card->qdio.do_prio_queueing && (ipv == 6)) {
/* TODO: IPv6!!! */ /* TODO: IPv6!!! */
} }
@ -4041,7 +4043,8 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
*((u32 *) skb->dst->neighbour->primary_key); *((u32 *) skb->dst->neighbour->primary_key);
} else { } else {
/* fill in destination address used in ip header */ /* fill in destination address used in ip header */
*((u32 *) (&hdr->hdr.l3.dest_addr[12])) = skb->nh.iph->daddr; *((u32 *)(&hdr->hdr.l3.dest_addr[12])) =
ip_hdr(skb)->daddr;
} }
} else if (ipv == 6) { /* IPv6 or passthru */ } else if (ipv == 6) { /* IPv6 or passthru */
hdr->hdr.l3.flags = qeth_get_qeth_hdr_flags6(cast_type); hdr->hdr.l3.flags = qeth_get_qeth_hdr_flags6(cast_type);

View File

@ -40,7 +40,7 @@ qeth_tso_fill_header(struct qeth_card *card, struct sk_buff *skb)
QETH_DBF_TEXT(trace, 5, "tsofhdr"); QETH_DBF_TEXT(trace, 5, "tsofhdr");
hdr = (struct qeth_hdr_tso *) skb->data; hdr = (struct qeth_hdr_tso *) skb->data;
iph = skb->nh.iph; iph = ip_hdr(skb);
tcph = skb->h.th; tcph = skb->h.th;
/*fix header to TSO values ...*/ /*fix header to TSO values ...*/
hdr->hdr.hdr.l3.id = QETH_HEADER_TYPE_TSO; hdr->hdr.hdr.l3.id = QETH_HEADER_TYPE_TSO;
@ -63,13 +63,9 @@ qeth_tso_fill_header(struct qeth_card *card, struct sk_buff *skb)
static inline void static inline void
qeth_tso_set_tcpip_header(struct qeth_card *card, struct sk_buff *skb) qeth_tso_set_tcpip_header(struct qeth_card *card, struct sk_buff *skb)
{ {
struct iphdr *iph; struct iphdr *iph = ip_hdr(skb);
struct ipv6hdr *ip6h; struct ipv6hdr *ip6h = skb->nh.ipv6h;
struct tcphdr *tcph; struct tcphdr *tcph = skb->h.th;
iph = skb->nh.iph;
ip6h = skb->nh.ipv6h;
tcph = skb->h.th;
tcph->check = 0; tcph->check = 0;
if (skb->protocol == ETH_P_IPV6) { if (skb->protocol == ETH_P_IPV6) {

View File

@ -104,6 +104,15 @@ struct iphdr {
/*The options start here. */ /*The options start here. */
}; };
#ifdef __KERNEL__
#include <linux/skbuff.h>
static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
{
return (struct iphdr *)skb_network_header(skb);
}
#endif
struct ip_auth_hdr { struct ip_auth_hdr {
__u8 nexthdr; __u8 nexthdr;
__u8 hdrlen; /* This one is measured in 32 bit units! */ __u8 hdrlen; /* This one is measured in 32 bit units! */

View File

@ -247,7 +247,6 @@ struct sk_buff {
} h; } h;
union { union {
struct iphdr *iph;
struct ipv6hdr *ipv6h; struct ipv6hdr *ipv6h;
struct arphdr *arph; struct arphdr *arph;
unsigned char *raw; unsigned char *raw;

View File

@ -116,7 +116,7 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb)
case __constant_htons(ETH_P_IP): case __constant_htons(ETH_P_IP):
if (skb_network_header(skb) + sizeof(struct iphdr) <= if (skb_network_header(skb) + sizeof(struct iphdr) <=
skb->tail) skb->tail)
return IP_ECN_set_ce(skb->nh.iph); return IP_ECN_set_ce(ip_hdr(skb));
break; break;
case __constant_htons(ETH_P_IPV6): case __constant_htons(ETH_P_IPV6):

View File

@ -46,7 +46,7 @@ struct inet_skb_parm
static inline unsigned int ip_hdrlen(const struct sk_buff *skb) static inline unsigned int ip_hdrlen(const struct sk_buff *skb)
{ {
return skb->nh.iph->ihl * 4; return ip_hdr(skb)->ihl * 4;
} }
struct ipcm_cookie struct ipcm_cookie

View File

@ -334,8 +334,8 @@ static inline unsigned char * tcf_get_base_ptr(struct sk_buff *skb, int layer)
return NULL; return NULL;
} }
static inline int tcf_valid_offset(struct sk_buff *skb, unsigned char *ptr, static inline int tcf_valid_offset(const struct sk_buff *skb,
int len) const unsigned char *ptr, const int len)
{ {
return unlikely((ptr + len) < skb->tail && ptr > skb->head); return unlikely((ptr + len) < skb->tail && ptr > skb->head);
} }

View File

@ -715,7 +715,7 @@ static void mpc_push(struct atm_vcc *vcc, struct sk_buff *skb)
new_skb->protocol = eth_type_trans(new_skb, dev); new_skb->protocol = eth_type_trans(new_skb, dev);
skb_reset_network_header(new_skb); skb_reset_network_header(new_skb);
eg->latest_ip_addr = new_skb->nh.iph->saddr; eg->latest_ip_addr = ip_hdr(new_skb)->saddr;
eg->packets_rcvd++; eg->packets_rcvd++;
mpc->eg_ops->put(eg); mpc->eg_ops->put(eg);

View File

@ -48,8 +48,8 @@
#define skb_origaddr(skb) (((struct bridge_skb_cb *) \ #define skb_origaddr(skb) (((struct bridge_skb_cb *) \
(skb->nf_bridge->data))->daddr.ipv4) (skb->nf_bridge->data))->daddr.ipv4)
#define store_orig_dstaddr(skb) (skb_origaddr(skb) = (skb)->nh.iph->daddr) #define store_orig_dstaddr(skb) (skb_origaddr(skb) = ip_hdr(skb)->daddr)
#define dnat_took_place(skb) (skb_origaddr(skb) != (skb)->nh.iph->daddr) #define dnat_took_place(skb) (skb_origaddr(skb) != ip_hdr(skb)->daddr)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static struct ctl_table_header *brnf_sysctl_header; static struct ctl_table_header *brnf_sysctl_header;
@ -265,7 +265,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
static int br_nf_pre_routing_finish(struct sk_buff *skb) static int br_nf_pre_routing_finish(struct sk_buff *skb)
{ {
struct net_device *dev = skb->dev; struct net_device *dev = skb->dev;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct nf_bridge_info *nf_bridge = skb->nf_bridge; struct nf_bridge_info *nf_bridge = skb->nf_bridge;
int err; int err;
@ -520,14 +520,14 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
if (!pskb_may_pull(skb, sizeof(struct iphdr))) if (!pskb_may_pull(skb, sizeof(struct iphdr)))
goto inhdr_error; goto inhdr_error;
iph = skb->nh.iph; iph = ip_hdr(skb);
if (iph->ihl < 5 || iph->version != 4) if (iph->ihl < 5 || iph->version != 4)
goto inhdr_error; goto inhdr_error;
if (!pskb_may_pull(skb, 4 * iph->ihl)) if (!pskb_may_pull(skb, 4 * iph->ihl))
goto inhdr_error; goto inhdr_error;
iph = skb->nh.iph; iph = ip_hdr(skb);
if (ip_fast_csum((__u8 *) iph, iph->ihl) != 0) if (ip_fast_csum((__u8 *) iph, iph->ihl) != 0)
goto inhdr_error; goto inhdr_error;

View File

@ -310,7 +310,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
skb_push(skb, sizeof(*iph)); skb_push(skb, sizeof(*iph));
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
/* iph->version = 4; iph->ihl = 5; */ /* iph->version = 4; iph->ihl = 5; */
put_unaligned(0x45, (unsigned char *)iph); put_unaligned(0x45, (unsigned char *)iph);

View File

@ -2391,7 +2391,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev); VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev);
skb->dev = odev; skb->dev = odev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->nh.iph = iph; skb->nh.raw = (unsigned char *)iph;
skb->h.uh = udph; skb->h.uh = udph;
if (pkt_dev->nfrags <= 0) if (pkt_dev->nfrags <= 0)

View File

@ -363,8 +363,8 @@ EXPORT_SYMBOL_GPL(dccp_v4_send_check);
static inline u64 dccp_v4_init_sequence(const struct sk_buff *skb) static inline u64 dccp_v4_init_sequence(const struct sk_buff *skb)
{ {
return secure_dccp_sequence_number(skb->nh.iph->daddr, return secure_dccp_sequence_number(ip_hdr(skb)->daddr,
skb->nh.iph->saddr, ip_hdr(skb)->saddr,
dccp_hdr(skb)->dccph_dport, dccp_hdr(skb)->dccph_dport,
dccp_hdr(skb)->dccph_sport); dccp_hdr(skb)->dccph_sport);
} }
@ -405,7 +405,7 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
newinet->opt = ireq->opt; newinet->opt = ireq->opt;
ireq->opt = NULL; ireq->opt = NULL;
newinet->mc_index = inet_iif(skb); newinet->mc_index = inet_iif(skb);
newinet->mc_ttl = skb->nh.iph->ttl; newinet->mc_ttl = ip_hdr(skb)->ttl;
newinet->id = jiffies; newinet->id = jiffies;
dccp_sync_mss(newsk, dst_mtu(dst)); dccp_sync_mss(newsk, dst_mtu(dst));
@ -428,7 +428,7 @@ EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
{ {
const struct dccp_hdr *dh = dccp_hdr(skb); const struct dccp_hdr *dh = dccp_hdr(skb);
const struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
struct sock *nsk; struct sock *nsk;
struct request_sock **prev; struct request_sock **prev;
/* Find possible connection requests. */ /* Find possible connection requests. */
@ -460,8 +460,8 @@ static struct dst_entry* dccp_v4_route_skb(struct sock *sk,
struct rtable *rt; struct rtable *rt;
struct flowi fl = { .oif = ((struct rtable *)skb->dst)->rt_iif, struct flowi fl = { .oif = ((struct rtable *)skb->dst)->rt_iif,
.nl_u = { .ip4_u = .nl_u = { .ip4_u =
{ .daddr = skb->nh.iph->saddr, { .daddr = ip_hdr(skb)->saddr,
.saddr = skb->nh.iph->daddr, .saddr = ip_hdr(skb)->daddr,
.tos = RT_CONN_FLAGS(sk) } }, .tos = RT_CONN_FLAGS(sk) } },
.proto = sk->sk_protocol, .proto = sk->sk_protocol,
.uli_u = { .ports = .uli_u = { .ports =
@ -513,6 +513,7 @@ static void dccp_v4_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
{ {
int err; int err;
struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh; struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh;
const struct iphdr *rxiph;
const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) + const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) +
sizeof(struct dccp_hdr_ext) + sizeof(struct dccp_hdr_ext) +
sizeof(struct dccp_hdr_reset); sizeof(struct dccp_hdr_reset);
@ -559,13 +560,13 @@ static void dccp_v4_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), DCCP_SKB_CB(rxskb)->dccpd_seq); dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), DCCP_SKB_CB(rxskb)->dccpd_seq);
dccp_csum_outgoing(skb); dccp_csum_outgoing(skb);
dh->dccph_checksum = dccp_v4_csum_finish(skb, rxskb->nh.iph->saddr, rxiph = ip_hdr(rxskb);
rxskb->nh.iph->daddr); dh->dccph_checksum = dccp_v4_csum_finish(skb, rxiph->saddr,
rxiph->daddr);
bh_lock_sock(dccp_v4_ctl_socket->sk); bh_lock_sock(dccp_v4_ctl_socket->sk);
err = ip_build_and_send_pkt(skb, dccp_v4_ctl_socket->sk, err = ip_build_and_send_pkt(skb, dccp_v4_ctl_socket->sk,
rxskb->nh.iph->daddr, rxiph->daddr, rxiph->saddr, NULL);
rxskb->nh.iph->saddr, NULL);
bh_unlock_sock(dccp_v4_ctl_socket->sk); bh_unlock_sock(dccp_v4_ctl_socket->sk);
if (net_xmit_eval(err) == 0) { if (net_xmit_eval(err) == 0) {
@ -640,8 +641,8 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
goto drop_and_free; goto drop_and_free;
ireq = inet_rsk(req); ireq = inet_rsk(req);
ireq->loc_addr = skb->nh.iph->daddr; ireq->loc_addr = ip_hdr(skb)->daddr;
ireq->rmt_addr = skb->nh.iph->saddr; ireq->rmt_addr = ip_hdr(skb)->saddr;
ireq->opt = NULL; ireq->opt = NULL;
/* /*
@ -809,6 +810,7 @@ EXPORT_SYMBOL_GPL(dccp_invalid_packet);
static int dccp_v4_rcv(struct sk_buff *skb) static int dccp_v4_rcv(struct sk_buff *skb)
{ {
const struct dccp_hdr *dh; const struct dccp_hdr *dh;
const struct iphdr *iph;
struct sock *sk; struct sock *sk;
int min_cov; int min_cov;
@ -817,8 +819,9 @@ static int dccp_v4_rcv(struct sk_buff *skb)
if (dccp_invalid_packet(skb)) if (dccp_invalid_packet(skb))
goto discard_it; goto discard_it;
iph = ip_hdr(skb);
/* Step 1: If header checksum is incorrect, drop packet and return */ /* Step 1: If header checksum is incorrect, drop packet and return */
if (dccp_v4_csum_finish(skb, skb->nh.iph->saddr, skb->nh.iph->daddr)) { if (dccp_v4_csum_finish(skb, iph->saddr, iph->daddr)) {
DCCP_WARN("dropped packet with invalid checksum\n"); DCCP_WARN("dropped packet with invalid checksum\n");
goto discard_it; goto discard_it;
} }
@ -832,8 +835,8 @@ static int dccp_v4_rcv(struct sk_buff *skb)
"src=%u.%u.%u.%u@%-5d " "src=%u.%u.%u.%u@%-5d "
"dst=%u.%u.%u.%u@%-5d seq=%llu", "dst=%u.%u.%u.%u@%-5d seq=%llu",
dccp_packet_name(dh->dccph_type), dccp_packet_name(dh->dccph_type),
NIPQUAD(skb->nh.iph->saddr), ntohs(dh->dccph_sport), NIPQUAD(iph->saddr), ntohs(dh->dccph_sport),
NIPQUAD(skb->nh.iph->daddr), ntohs(dh->dccph_dport), NIPQUAD(iph->daddr), ntohs(dh->dccph_dport),
(unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq); (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq);
if (dccp_packet_without_ack(skb)) { if (dccp_packet_without_ack(skb)) {
@ -848,10 +851,8 @@ static int dccp_v4_rcv(struct sk_buff *skb)
/* Step 2: /* Step 2:
* Look up flow ID in table and get corresponding socket */ * Look up flow ID in table and get corresponding socket */
sk = __inet_lookup(&dccp_hashinfo, sk = __inet_lookup(&dccp_hashinfo,
skb->nh.iph->saddr, dh->dccph_sport, iph->saddr, dh->dccph_sport,
skb->nh.iph->daddr, dh->dccph_dport, iph->daddr, dh->dccph_dport, inet_iif(skb));
inet_iif(skb));
/* /*
* Step 2: * Step 2:
* If no socket ... * If no socket ...

View File

@ -848,7 +848,7 @@ static void aun_send_response(__u32 addr, unsigned long seq, int code, int cb)
static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len) static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
{ {
struct iphdr *ip = skb->nh.iph; struct iphdr *ip = ip_hdr(skb);
unsigned char stn = ntohl(ip->saddr) & 0xff; unsigned char stn = ntohl(ip->saddr) & 0xff;
struct sock *sk; struct sock *sk;
struct sk_buff *newskb; struct sk_buff *newskb;
@ -946,7 +946,7 @@ static void aun_data_available(struct sock *sk, int slen)
data = skb->h.raw + sizeof(struct udphdr); data = skb->h.raw + sizeof(struct udphdr);
ah = (struct aunhdr *)data; ah = (struct aunhdr *)data;
len = skb->len - sizeof(struct udphdr); len = skb->len - sizeof(struct udphdr);
ip = skb->nh.iph; ip = ip_hdr(skb);
switch (ah->code) switch (ah->code)
{ {

View File

@ -228,7 +228,7 @@ static int ieee80211_classify(struct sk_buff *skb)
if (eth->h_proto != htons(ETH_P_IP)) if (eth->h_proto != htons(ETH_P_IP))
return 0; return 0;
ip = skb->nh.iph; ip = ip_hdr(skb);
switch (ip->tos & 0xfc) { switch (ip->tos & 0xfc) {
case 0x20: case 0x20:
return 2; return 2;

View File

@ -1112,7 +1112,7 @@ static int inet_gso_send_check(struct sk_buff *skb)
if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
goto out; goto out;
iph = skb->nh.iph; iph = ip_hdr(skb);
ihl = iph->ihl * 4; ihl = iph->ihl * 4;
if (ihl < sizeof(*iph)) if (ihl < sizeof(*iph))
goto out; goto out;
@ -1121,7 +1121,7 @@ static int inet_gso_send_check(struct sk_buff *skb)
goto out; goto out;
skb->h.raw = __skb_pull(skb, ihl); skb->h.raw = __skb_pull(skb, ihl);
iph = skb->nh.iph; iph = ip_hdr(skb);
proto = iph->protocol & (MAX_INET_PROTOS - 1); proto = iph->protocol & (MAX_INET_PROTOS - 1);
err = -EPROTONOSUPPORT; err = -EPROTONOSUPPORT;
@ -1155,7 +1155,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
goto out; goto out;
iph = skb->nh.iph; iph = ip_hdr(skb);
ihl = iph->ihl * 4; ihl = iph->ihl * 4;
if (ihl < sizeof(*iph)) if (ihl < sizeof(*iph))
goto out; goto out;
@ -1164,7 +1164,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
goto out; goto out;
skb->h.raw = __skb_pull(skb, ihl); skb->h.raw = __skb_pull(skb, ihl);
iph = skb->nh.iph; iph = ip_hdr(skb);
id = ntohs(iph->id); id = ntohs(iph->id);
proto = iph->protocol & (MAX_INET_PROTOS - 1); proto = iph->protocol & (MAX_INET_PROTOS - 1);
segs = ERR_PTR(-EPROTONOSUPPORT); segs = ERR_PTR(-EPROTONOSUPPORT);
@ -1180,7 +1180,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
skb = segs; skb = segs;
do { do {
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->id = htons(id++); iph->id = htons(id++);
iph->tot_len = htons(skb->len - skb->mac_len); iph->tot_len = htons(skb->len - skb->mac_len);
iph->check = 0; iph->check = 0;

View File

@ -65,7 +65,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb)
char buf[60]; char buf[60];
} tmp_iph; } tmp_iph;
top_iph = skb->nh.iph; top_iph = ip_hdr(skb);
iph = &tmp_iph.iph; iph = &tmp_iph.iph;
iph->tos = top_iph->tos; iph->tos = top_iph->tos;
@ -152,7 +152,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
ah = (struct ip_auth_hdr*)skb->data; ah = (struct ip_auth_hdr*)skb->data;
iph = skb->nh.iph; iph = ip_hdr(skb);
ihl = skb->data - skb_network_header(skb); ihl = skb->data - skb_network_header(skb);
memcpy(work_buf, iph, ihl); memcpy(work_buf, iph, ihl);

View File

@ -342,13 +342,13 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
switch (IN_DEV_ARP_ANNOUNCE(in_dev)) { switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
default: default:
case 0: /* By default announce any local IP */ case 0: /* By default announce any local IP */
if (skb && inet_addr_type(skb->nh.iph->saddr) == RTN_LOCAL) if (skb && inet_addr_type(ip_hdr(skb)->saddr) == RTN_LOCAL)
saddr = skb->nh.iph->saddr; saddr = ip_hdr(skb)->saddr;
break; break;
case 1: /* Restrict announcements of saddr in same subnet */ case 1: /* Restrict announcements of saddr in same subnet */
if (!skb) if (!skb)
break; break;
saddr = skb->nh.iph->saddr; saddr = ip_hdr(skb)->saddr;
if (inet_addr_type(saddr) == RTN_LOCAL) { if (inet_addr_type(saddr) == RTN_LOCAL) {
/* saddr should be known to target */ /* saddr should be known to target */
if (inet_addr_onlink(in_dev, target, saddr)) if (inet_addr_onlink(in_dev, target, saddr))

View File

@ -1676,7 +1676,7 @@ validate_return:
*/ */
void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway) void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
{ {
if (skb->nh.iph->protocol == IPPROTO_ICMP || error != -EACCES) if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES)
return; return;
if (gateway) if (gateway)

View File

@ -58,7 +58,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
pskb_put(skb, trailer, clen - skb->len); pskb_put(skb, trailer, clen - skb->len);
__skb_push(skb, skb->data - skb_network_header(skb)); __skb_push(skb, skb->data - skb_network_header(skb));
top_iph = skb->nh.iph; top_iph = ip_hdr(skb);
esph = (struct ip_esp_hdr *)(skb_network_header(skb) + esph = (struct ip_esp_hdr *)(skb_network_header(skb) +
top_iph->ihl * 4); top_iph->ihl * 4);
top_iph->tot_len = htons(skb->len + alen); top_iph->tot_len = htons(skb->len + alen);
@ -218,7 +218,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
/* ... check padding bits here. Silly. :-) */ /* ... check padding bits here. Silly. :-) */
iph = skb->nh.iph; iph = ip_hdr(skb);
ihl = iph->ihl * 4; ihl = iph->ihl * 4;
if (x->encap) { if (x->encap) {

View File

@ -392,7 +392,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
icmp_param->data.icmph.checksum = 0; icmp_param->data.icmph.checksum = 0;
icmp_out_count(icmp_param->data.icmph.type); icmp_out_count(icmp_param->data.icmph.type);
inet->tos = skb->nh.iph->tos; inet->tos = ip_hdr(skb)->tos;
daddr = ipc.addr = rt->rt_src; daddr = ipc.addr = rt->rt_src;
ipc.opt = NULL; ipc.opt = NULL;
if (icmp_param->replyopts.optlen) { if (icmp_param->replyopts.optlen) {
@ -404,7 +404,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
struct flowi fl = { .nl_u = { .ip4_u = struct flowi fl = { .nl_u = { .ip4_u =
{ .daddr = daddr, { .daddr = daddr,
.saddr = rt->rt_spec_dst, .saddr = rt->rt_spec_dst,
.tos = RT_TOS(skb->nh.iph->tos) } }, .tos = RT_TOS(ip_hdr(skb)->tos) } },
.proto = IPPROTO_ICMP }; .proto = IPPROTO_ICMP };
security_skb_classify_flow(skb, &fl); security_skb_classify_flow(skb, &fl);
if (ip_route_output_key(&rt, &fl)) if (ip_route_output_key(&rt, &fl))
@ -448,7 +448,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
* Check this, icmp_send is called from the most obscure devices * Check this, icmp_send is called from the most obscure devices
* sometimes. * sometimes.
*/ */
iph = skb_in->nh.iph; iph = ip_hdr(skb_in);
if ((u8 *)iph < skb_in->head || (u8 *)(iph + 1) > skb_in->tail) if ((u8 *)iph < skb_in->head || (u8 *)(iph + 1) > skb_in->tail)
goto out; goto out;
@ -676,7 +676,7 @@ static void icmp_unreach(struct sk_buff *skb)
printk(KERN_WARNING "%u.%u.%u.%u sent an invalid ICMP " printk(KERN_WARNING "%u.%u.%u.%u sent an invalid ICMP "
"type %u, code %u " "type %u, code %u "
"error to a broadcast: %u.%u.%u.%u on %s\n", "error to a broadcast: %u.%u.%u.%u on %s\n",
NIPQUAD(skb->nh.iph->saddr), NIPQUAD(ip_hdr(skb)->saddr),
icmph->type, icmph->code, icmph->type, icmph->code,
NIPQUAD(iph->daddr), NIPQUAD(iph->daddr),
skb->dev->name); skb->dev->name);
@ -751,7 +751,7 @@ static void icmp_redirect(struct sk_buff *skb)
*/ */
case ICMP_REDIR_HOST: case ICMP_REDIR_HOST:
case ICMP_REDIR_HOSTTOS: case ICMP_REDIR_HOSTTOS:
ip_rt_redirect(skb->nh.iph->saddr, iph->daddr, ip_rt_redirect(ip_hdr(skb)->saddr, iph->daddr,
skb->h.icmph->un.gateway, skb->h.icmph->un.gateway,
iph->saddr, skb->dev); iph->saddr, skb->dev);
break; break;

View File

@ -315,7 +315,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
skb_reserve(skb, LL_RESERVED_SPACE(dev)); skb_reserve(skb, LL_RESERVED_SPACE(dev));
skb_reset_network_header(skb); skb_reset_network_header(skb);
pip = skb->nh.iph; pip = ip_hdr(skb);
skb_put(skb, sizeof(struct iphdr) + 4); skb_put(skb, sizeof(struct iphdr) + 4);
pip->version = 4; pip->version = 4;
@ -345,16 +345,14 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
static int igmpv3_sendpack(struct sk_buff *skb) static int igmpv3_sendpack(struct sk_buff *skb)
{ {
struct iphdr *pip = skb->nh.iph; struct iphdr *pip = ip_hdr(skb);
struct igmphdr *pig = skb->h.igmph; struct igmphdr *pig = skb->h.igmph;
int iplen, igmplen; const int iplen = skb->tail - skb->nh.raw;
const int igmplen = skb->tail - skb->h.raw;
iplen = skb->tail - (unsigned char *)skb->nh.iph;
pip->tot_len = htons(iplen); pip->tot_len = htons(iplen);
ip_send_check(pip); ip_send_check(pip);
pig->csum = ip_compute_csum(skb->h.igmph, igmplen);
igmplen = skb->tail - (unsigned char *)skb->h.igmph;
pig->csum = ip_compute_csum((void *)skb->h.igmph, igmplen);
return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dev, return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dev,
dst_output); dst_output);
@ -667,7 +665,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
skb_reserve(skb, LL_RESERVED_SPACE(dev)); skb_reserve(skb, LL_RESERVED_SPACE(dev));
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
skb_put(skb, sizeof(struct iphdr) + 4); skb_put(skb, sizeof(struct iphdr) + 4);
iph->version = 4; iph->version = 4;

View File

@ -74,7 +74,7 @@ int ip_forward(struct sk_buff *skb)
* that reaches zero, we must reply an ICMP control message telling * that reaches zero, we must reply an ICMP control message telling
* that the packet's lifetime expired. * that the packet's lifetime expired.
*/ */
if (skb->nh.iph->ttl <= 1) if (ip_hdr(skb)->ttl <= 1)
goto too_many_hops; goto too_many_hops;
if (!xfrm4_route_forward(skb)) if (!xfrm4_route_forward(skb))
@ -88,7 +88,7 @@ int ip_forward(struct sk_buff *skb)
/* We are about to mangle packet. Copy it! */ /* We are about to mangle packet. Copy it! */
if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+rt->u.dst.header_len)) if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+rt->u.dst.header_len))
goto drop; goto drop;
iph = skb->nh.iph; iph = ip_hdr(skb);
/* Decrease ttl after skb cow done */ /* Decrease ttl after skb cow done */
ip_decrease_ttl(iph); ip_decrease_ttl(iph);

View File

@ -479,7 +479,7 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
goto err; goto err;
} }
offset = ntohs(skb->nh.iph->frag_off); offset = ntohs(ip_hdr(skb)->frag_off);
flags = offset & ~IP_OFFSET; flags = offset & ~IP_OFFSET;
offset &= IP_OFFSET; offset &= IP_OFFSET;
offset <<= 3; /* offset is in 8-byte chunks */ offset <<= 3; /* offset is in 8-byte chunks */
@ -676,7 +676,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
head->dev = dev; head->dev = dev;
head->tstamp = qp->stamp; head->tstamp = qp->stamp;
iph = head->nh.iph; iph = ip_hdr(head);
iph->frag_off = 0; iph->frag_off = 0;
iph->tot_len = htons(len); iph->tot_len = htons(len);
IP_INC_STATS_BH(IPSTATS_MIB_REASMOKS); IP_INC_STATS_BH(IPSTATS_MIB_REASMOKS);
@ -700,7 +700,6 @@ out_fail:
/* Process an incoming IP datagram fragment. */ /* Process an incoming IP datagram fragment. */
struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user) struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user)
{ {
struct iphdr *iph = skb->nh.iph;
struct ipq *qp; struct ipq *qp;
struct net_device *dev; struct net_device *dev;
@ -713,7 +712,7 @@ struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user)
dev = skb->dev; dev = skb->dev;
/* Lookup (or create) queue header */ /* Lookup (or create) queue header */
if ((qp = ip_find(iph, user)) != NULL) { if ((qp = ip_find(ip_hdr(skb), user)) != NULL) {
struct sk_buff *ret = NULL; struct sk_buff *ret = NULL;
spin_lock(&qp->lock); spin_lock(&qp->lock);

View File

@ -533,7 +533,7 @@ static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
{ {
if (INET_ECN_is_ce(iph->tos)) { if (INET_ECN_is_ce(iph->tos)) {
if (skb->protocol == htons(ETH_P_IP)) { if (skb->protocol == htons(ETH_P_IP)) {
IP_ECN_set_ce(skb->nh.iph); IP_ECN_set_ce(ip_hdr(skb));
} else if (skb->protocol == htons(ETH_P_IPV6)) { } else if (skb->protocol == htons(ETH_P_IPV6)) {
IP6_ECN_set_ce(skb->nh.ipv6h); IP6_ECN_set_ce(skb->nh.ipv6h);
} }
@ -565,7 +565,7 @@ static int ipgre_rcv(struct sk_buff *skb)
if (!pskb_may_pull(skb, 16)) if (!pskb_may_pull(skb, 16))
goto drop_nolock; goto drop_nolock;
iph = skb->nh.iph; iph = ip_hdr(skb);
h = skb->data; h = skb->data;
flags = *(__be16*)h; flags = *(__be16*)h;
@ -670,7 +670,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct ip_tunnel *tunnel = netdev_priv(dev); struct ip_tunnel *tunnel = netdev_priv(dev);
struct net_device_stats *stats = &tunnel->stat; struct net_device_stats *stats = &tunnel->stat;
struct iphdr *old_iph = skb->nh.iph; struct iphdr *old_iph = ip_hdr(skb);
struct iphdr *tiph; struct iphdr *tiph;
u8 tos; u8 tos;
__be16 df; __be16 df;
@ -825,7 +825,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
skb_set_owner_w(new_skb, skb->sk); skb_set_owner_w(new_skb, skb->sk);
dev_kfree_skb(skb); dev_kfree_skb(skb);
skb = new_skb; skb = new_skb;
old_iph = skb->nh.iph; old_iph = ip_hdr(skb);
} }
skb->h.raw = skb->nh.raw; skb->h.raw = skb->nh.raw;
@ -841,7 +841,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
* Push down and install the IPIP header. * Push down and install the IPIP header.
*/ */
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->version = 4; iph->version = 4;
iph->ihl = sizeof(struct iphdr) >> 2; iph->ihl = sizeof(struct iphdr) >> 2;
iph->frag_off = df; iph->frag_off = df;

View File

@ -158,7 +158,7 @@ DEFINE_SNMP_STAT(struct ipstats_mib, ip_statistics) __read_mostly;
int ip_call_ra_chain(struct sk_buff *skb) int ip_call_ra_chain(struct sk_buff *skb)
{ {
struct ip_ra_chain *ra; struct ip_ra_chain *ra;
u8 protocol = skb->nh.iph->protocol; u8 protocol = ip_hdr(skb)->protocol;
struct sock *last = NULL; struct sock *last = NULL;
read_lock(&ip_ra_lock); read_lock(&ip_ra_lock);
@ -171,7 +171,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
if (sk && inet_sk(sk)->num == protocol && if (sk && inet_sk(sk)->num == protocol &&
(!sk->sk_bound_dev_if || (!sk->sk_bound_dev_if ||
sk->sk_bound_dev_if == skb->dev->ifindex)) { sk->sk_bound_dev_if == skb->dev->ifindex)) {
if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
skb = ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN); skb = ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN);
if (skb == NULL) { if (skb == NULL) {
read_unlock(&ip_ra_lock); read_unlock(&ip_ra_lock);
@ -206,7 +206,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
rcu_read_lock(); rcu_read_lock();
{ {
/* Note: See raw.c and net/raw.h, RAWV4_HTABLE_SIZE==MAX_INET_PROTOS */ /* Note: See raw.c and net/raw.h, RAWV4_HTABLE_SIZE==MAX_INET_PROTOS */
int protocol = skb->nh.iph->protocol; int protocol = ip_hdr(skb)->protocol;
int hash; int hash;
struct sock *raw_sk; struct sock *raw_sk;
struct net_protocol *ipprot; struct net_protocol *ipprot;
@ -218,7 +218,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
/* If there maybe a raw socket we must check - if not we /* If there maybe a raw socket we must check - if not we
* don't care less * don't care less
*/ */
if (raw_sk && !raw_v4_input(skb, skb->nh.iph, hash)) if (raw_sk && !raw_v4_input(skb, ip_hdr(skb), hash))
raw_sk = NULL; raw_sk = NULL;
if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) { if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
@ -264,7 +264,7 @@ int ip_local_deliver(struct sk_buff *skb)
* Reassemble IP fragments. * Reassemble IP fragments.
*/ */
if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
skb = ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER); skb = ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);
if (!skb) if (!skb)
return 0; return 0;
@ -292,7 +292,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)
goto drop; goto drop;
} }
iph = skb->nh.iph; iph = ip_hdr(skb);
if (ip_options_compile(NULL, skb)) { if (ip_options_compile(NULL, skb)) {
IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
@ -328,7 +328,7 @@ drop:
static inline int ip_rcv_finish(struct sk_buff *skb) static inline int ip_rcv_finish(struct sk_buff *skb)
{ {
struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
/* /*
* Initialise the virtual path cache for the packet. It describes * Initialise the virtual path cache for the packet. It describes
@ -389,7 +389,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
if (!pskb_may_pull(skb, sizeof(struct iphdr))) if (!pskb_may_pull(skb, sizeof(struct iphdr)))
goto inhdr_error; goto inhdr_error;
iph = skb->nh.iph; iph = ip_hdr(skb);
/* /*
* RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum. * RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum.
@ -408,7 +408,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
if (!pskb_may_pull(skb, iph->ihl*4)) if (!pskb_may_pull(skb, iph->ihl*4))
goto inhdr_error; goto inhdr_error;
iph = skb->nh.iph; iph = ip_hdr(skb);
if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
goto inhdr_error; goto inhdr_error;

View File

@ -110,7 +110,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
if (skb->dst) if (skb->dst)
daddr = ((struct rtable*)skb->dst)->rt_spec_dst; daddr = ((struct rtable*)skb->dst)->rt_spec_dst;
else else
daddr = skb->nh.iph->daddr; daddr = ip_hdr(skb)->daddr;
if (sopt->rr) { if (sopt->rr) {
optlen = sptr[sopt->rr+1]; optlen = sptr[sopt->rr+1];
@ -180,7 +180,8 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
/* /*
* RFC1812 requires to fix illegal source routes. * RFC1812 requires to fix illegal source routes.
*/ */
if (memcmp(&skb->nh.iph->saddr, &start[soffset+3], 4) == 0) if (memcmp(&ip_hdr(skb)->saddr,
&start[soffset + 3], 4) == 0)
doffset -= 4; doffset -= 4;
} }
if (doffset > 3) { if (doffset > 3) {
@ -269,7 +270,8 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
optptr = iph + sizeof(struct iphdr); optptr = iph + sizeof(struct iphdr);
opt->is_data = 0; opt->is_data = 0;
} else { } else {
optptr = opt->is_data ? opt->__data : (unsigned char*)&(skb->nh.iph[1]); optptr = opt->is_data ? opt->__data :
(unsigned char *)&(ip_hdr(skb)[1]);
iph = optptr - sizeof(struct iphdr); iph = optptr - sizeof(struct iphdr);
} }
@ -587,7 +589,7 @@ void ip_forward_options(struct sk_buff *skb)
if (srrptr + 3 <= srrspace) { if (srrptr + 3 <= srrspace) {
opt->is_changed = 1; opt->is_changed = 1;
ip_rt_get_source(&optptr[srrptr-1], rt); ip_rt_get_source(&optptr[srrptr-1], rt);
skb->nh.iph->daddr = rt->rt_dst; ip_hdr(skb)->daddr = rt->rt_dst;
optptr[2] = srrptr+4; optptr[2] = srrptr+4;
} else if (net_ratelimit()) } else if (net_ratelimit())
printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n"); printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n");
@ -599,7 +601,7 @@ void ip_forward_options(struct sk_buff *skb)
} }
if (opt->is_changed) { if (opt->is_changed) {
opt->is_changed = 0; opt->is_changed = 0;
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
} }
} }
@ -608,7 +610,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
struct ip_options *opt = &(IPCB(skb)->opt); struct ip_options *opt = &(IPCB(skb)->opt);
int srrspace, srrptr; int srrspace, srrptr;
__be32 nexthop; __be32 nexthop;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
unsigned char *optptr = skb_network_header(skb) + opt->srr; unsigned char *optptr = skb_network_header(skb) + opt->srr;
struct rtable *rt = (struct rtable*)skb->dst; struct rtable *rt = (struct rtable*)skb->dst;
struct rtable *rt2; struct rtable *rt2;

View File

@ -127,7 +127,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
/* Build the IP header. */ /* Build the IP header. */
skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0)); skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0));
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->version = 4; iph->version = 4;
iph->ihl = 5; iph->ihl = 5;
iph->tos = inet->tos; iph->tos = inet->tos;
@ -245,7 +245,7 @@ int ip_mc_output(struct sk_buff *skb)
/* Multicasts with ttl 0 must not go beyond the host */ /* Multicasts with ttl 0 must not go beyond the host */
if (skb->nh.iph->ttl == 0) { if (ip_hdr(skb)->ttl == 0) {
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
} }
@ -332,7 +332,7 @@ packet_routed:
/* OK, we know where to send it, allocate and build IP header. */ /* OK, we know where to send it, allocate and build IP header. */
skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0)); skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0));
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
*((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff)); *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff));
iph->tot_len = htons(skb->len); iph->tot_len = htons(skb->len);
if (ip_dont_fragment(sk, &rt->u.dst) && !ipfragok) if (ip_dont_fragment(sk, &rt->u.dst) && !ipfragok)
@ -428,7 +428,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
* Point into the IP datagram header. * Point into the IP datagram header.
*/ */
iph = skb->nh.iph; iph = ip_hdr(skb);
if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) { if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) {
IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); IP_INC_STATS(IPSTATS_MIB_FRAGFAILS);
@ -504,7 +504,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
__skb_push(frag, hlen); __skb_push(frag, hlen);
skb_reset_network_header(frag); skb_reset_network_header(frag);
memcpy(skb_network_header(frag), iph, hlen); memcpy(skb_network_header(frag), iph, hlen);
iph = frag->nh.iph; iph = ip_hdr(frag);
iph->tot_len = htons(frag->len); iph->tot_len = htons(frag->len);
ip_copy_metadata(frag, skb); ip_copy_metadata(frag, skb);
if (offset == 0) if (offset == 0)
@ -619,7 +619,7 @@ slow_path:
/* /*
* Fill in the new header fields. * Fill in the new header fields.
*/ */
iph = skb2->nh.iph; iph = ip_hdr(skb2);
iph->frag_off = htons((offset >> 3)); iph->frag_off = htons((offset >> 3));
/* ANK: dirty, but effective trick. Upgrade options only if /* ANK: dirty, but effective trick. Upgrade options only if
@ -1125,7 +1125,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page,
*/ */
data = skb_put(skb, fragheaderlen + fraggap); data = skb_put(skb, fragheaderlen + fraggap);
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
data += fragheaderlen; data += fragheaderlen;
skb->h.raw = data; skb->h.raw = data;
@ -1352,7 +1352,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar
struct flowi fl = { .nl_u = { .ip4_u = struct flowi fl = { .nl_u = { .ip4_u =
{ .daddr = daddr, { .daddr = daddr,
.saddr = rt->rt_spec_dst, .saddr = rt->rt_spec_dst,
.tos = RT_TOS(skb->nh.iph->tos) } }, .tos = RT_TOS(ip_hdr(skb)->tos) } },
/* Not quite clean, but right. */ /* Not quite clean, but right. */
.uli_u = { .ports = .uli_u = { .ports =
{ .sport = skb->h.th->dest, { .sport = skb->h.th->dest,
@ -1370,9 +1370,9 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar
with locally disabled BH and that sk cannot be already spinlocked. with locally disabled BH and that sk cannot be already spinlocked.
*/ */
bh_lock_sock(sk); bh_lock_sock(sk);
inet->tos = skb->nh.iph->tos; inet->tos = ip_hdr(skb)->tos;
sk->sk_priority = skb->priority; sk->sk_priority = skb->priority;
sk->sk_protocol = skb->nh.iph->protocol; sk->sk_protocol = ip_hdr(skb)->protocol;
ip_append_data(sk, ip_reply_glue_bits, arg->iov->iov_base, len, 0, ip_append_data(sk, ip_reply_glue_bits, arg->iov->iov_base, len, 0,
&ipc, rt, MSG_DONTWAIT); &ipc, rt, MSG_DONTWAIT);
if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) { if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {

View File

@ -59,7 +59,7 @@ static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
struct in_pktinfo info; struct in_pktinfo info;
struct rtable *rt = (struct rtable *)skb->dst; struct rtable *rt = (struct rtable *)skb->dst;
info.ipi_addr.s_addr = skb->nh.iph->daddr; info.ipi_addr.s_addr = ip_hdr(skb)->daddr;
if (rt) { if (rt) {
info.ipi_ifindex = rt->rt_iif; info.ipi_ifindex = rt->rt_iif;
info.ipi_spec_dst.s_addr = rt->rt_spec_dst; info.ipi_spec_dst.s_addr = rt->rt_spec_dst;
@ -73,13 +73,13 @@ static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
static void ip_cmsg_recv_ttl(struct msghdr *msg, struct sk_buff *skb) static void ip_cmsg_recv_ttl(struct msghdr *msg, struct sk_buff *skb)
{ {
int ttl = skb->nh.iph->ttl; int ttl = ip_hdr(skb)->ttl;
put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl); put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
} }
static void ip_cmsg_recv_tos(struct msghdr *msg, struct sk_buff *skb) static void ip_cmsg_recv_tos(struct msghdr *msg, struct sk_buff *skb)
{ {
put_cmsg(msg, SOL_IP, IP_TOS, 1, &skb->nh.iph->tos); put_cmsg(msg, SOL_IP, IP_TOS, 1, &ip_hdr(skb)->tos);
} }
static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb) static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
@ -87,7 +87,8 @@ static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
if (IPCB(skb)->opt.optlen == 0) if (IPCB(skb)->opt.optlen == 0)
return; return;
put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen, skb->nh.iph+1); put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen,
ip_hdr(skb) + 1);
} }
@ -299,7 +300,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
skb_put(skb, sizeof(struct iphdr)); skb_put(skb, sizeof(struct iphdr));
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->daddr = daddr; iph->daddr = daddr;
serr = SKB_EXT_ERR(skb); serr = SKB_EXT_ERR(skb);
@ -369,7 +370,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
sin->sin_family = AF_INET; sin->sin_family = AF_INET;
sin->sin_addr.s_addr = skb->nh.iph->saddr; sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
sin->sin_port = 0; sin->sin_port = 0;
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
if (inet->cmsg_flags) if (inet->cmsg_flags)

View File

@ -43,21 +43,15 @@ static LIST_HEAD(ipcomp_tfms_list);
static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)
{ {
int err, plen, dlen;
struct ipcomp_data *ipcd = x->data; struct ipcomp_data *ipcd = x->data;
u8 *start, *scratch; const int plen = skb->len;
struct crypto_comp *tfm; int dlen = IPCOMP_SCRATCH_SIZE;
int cpu; const u8 *start = skb->data;
const int cpu = get_cpu();
u8 *scratch = *per_cpu_ptr(ipcomp_scratches, cpu);
struct crypto_comp *tfm = *per_cpu_ptr(ipcd->tfms, cpu);
int err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen);
plen = skb->len;
dlen = IPCOMP_SCRATCH_SIZE;
start = skb->data;
cpu = get_cpu();
scratch = *per_cpu_ptr(ipcomp_scratches, cpu);
tfm = *per_cpu_ptr(ipcd->tfms, cpu);
err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen);
if (err) if (err)
goto out; goto out;
@ -90,7 +84,7 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
/* Remove ipcomp header and decompress original payload */ /* Remove ipcomp header and decompress original payload */
iph = skb->nh.iph; iph = ip_hdr(skb);
ipch = (void *)skb->data; ipch = (void *)skb->data;
iph->protocol = ipch->nexthdr; iph->protocol = ipch->nexthdr;
skb->h.raw = skb->nh.raw + sizeof(*ipch); skb->h.raw = skb->nh.raw + sizeof(*ipch);
@ -103,23 +97,16 @@ out:
static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb) static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)
{ {
int err, plen, dlen, ihlen;
struct iphdr *iph = skb->nh.iph;
struct ipcomp_data *ipcd = x->data; struct ipcomp_data *ipcd = x->data;
u8 *start, *scratch; const int ihlen = ip_hdrlen(skb);
struct crypto_comp *tfm; const int plen = skb->len - ihlen;
int cpu; int dlen = IPCOMP_SCRATCH_SIZE;
u8 *start = skb->data + ihlen;
const int cpu = get_cpu();
u8 *scratch = *per_cpu_ptr(ipcomp_scratches, cpu);
struct crypto_comp *tfm = *per_cpu_ptr(ipcd->tfms, cpu);
int err = crypto_comp_compress(tfm, start, plen, scratch, &dlen);
ihlen = iph->ihl * 4;
plen = skb->len - ihlen;
dlen = IPCOMP_SCRATCH_SIZE;
start = skb->data + ihlen;
cpu = get_cpu();
scratch = *per_cpu_ptr(ipcomp_scratches, cpu);
tfm = *per_cpu_ptr(ipcd->tfms, cpu);
err = crypto_comp_compress(tfm, start, plen, scratch, &dlen);
if (err) if (err)
goto out; goto out;
@ -142,12 +129,11 @@ out:
static int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb) static int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb)
{ {
int err; int err;
struct iphdr *iph;
struct ip_comp_hdr *ipch; struct ip_comp_hdr *ipch;
struct ipcomp_data *ipcd = x->data; struct ipcomp_data *ipcd = x->data;
int hdr_len = 0; int hdr_len = 0;
struct iphdr *iph = ip_hdr(skb);
iph = skb->nh.iph;
iph->tot_len = htons(skb->len); iph->tot_len = htons(skb->len);
hdr_len = iph->ihl * 4; hdr_len = iph->ihl * 4;
if ((skb->len - hdr_len) < ipcd->threshold) { if ((skb->len - hdr_len) < ipcd->threshold) {
@ -159,7 +145,7 @@ static int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb)
goto out_ok; goto out_ok;
err = ipcomp_compress(x, skb); err = ipcomp_compress(x, skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
if (err) { if (err) {
goto out_ok; goto out_ok;

View File

@ -703,7 +703,7 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d
/* Construct IP header */ /* Construct IP header */
skb_reset_network_header(skb); skb_reset_network_header(skb);
h = skb->nh.iph; h = ip_hdr(skb);
h->version = 4; h->version = 4;
h->ihl = 5; h->ihl = 5;
h->tot_len = htons(sizeof(struct bootp_pkt)); h->tot_len = htons(sizeof(struct bootp_pkt));
@ -846,7 +846,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
sizeof(struct udphdr))) sizeof(struct udphdr)))
goto drop; goto drop;
b = (struct bootp_pkt *) skb->nh.iph; b = (struct bootp_pkt *)skb_network_header(skb);
h = &b->iph; h = &b->iph;
if (h->ihl != 5 || h->version != 4 || h->protocol != IPPROTO_UDP) if (h->ihl != 5 || h->version != 4 || h->protocol != IPPROTO_UDP)
@ -884,7 +884,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
if (!pskb_may_pull(skb, skb->len)) if (!pskb_may_pull(skb, skb->len))
goto drop; goto drop;
b = (struct bootp_pkt *) skb->nh.iph; b = (struct bootp_pkt *)skb_network_header(skb);
h = &b->iph; h = &b->iph;
/* One reply at a time, please. */ /* One reply at a time, please. */

View File

@ -461,9 +461,10 @@ out:
#endif #endif
} }
static inline void ipip_ecn_decapsulate(struct iphdr *outer_iph, struct sk_buff *skb) static inline void ipip_ecn_decapsulate(const struct iphdr *outer_iph,
struct sk_buff *skb)
{ {
struct iphdr *inner_iph = skb->nh.iph; struct iphdr *inner_iph = ip_hdr(skb);
if (INET_ECN_is_ce(outer_iph->tos)) if (INET_ECN_is_ce(outer_iph->tos))
IP_ECN_set_ce(inner_iph); IP_ECN_set_ce(inner_iph);
@ -471,10 +472,8 @@ static inline void ipip_ecn_decapsulate(struct iphdr *outer_iph, struct sk_buff
static int ipip_rcv(struct sk_buff *skb) static int ipip_rcv(struct sk_buff *skb)
{ {
struct iphdr *iph;
struct ip_tunnel *tunnel; struct ip_tunnel *tunnel;
const struct iphdr *iph = ip_hdr(skb);
iph = skb->nh.iph;
read_lock(&ipip_lock); read_lock(&ipip_lock);
if ((tunnel = ipip_tunnel_lookup(iph->saddr, iph->daddr)) != NULL) { if ((tunnel = ipip_tunnel_lookup(iph->saddr, iph->daddr)) != NULL) {
@ -521,7 +520,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
__be16 df = tiph->frag_off; __be16 df = tiph->frag_off;
struct rtable *rt; /* Route to the other host */ struct rtable *rt; /* Route to the other host */
struct net_device *tdev; /* Device to other host */ struct net_device *tdev; /* Device to other host */
struct iphdr *old_iph = skb->nh.iph; struct iphdr *old_iph = ip_hdr(skb);
struct iphdr *iph; /* Our new IP header */ struct iphdr *iph; /* Our new IP header */
int max_headroom; /* The extra header space needed */ int max_headroom; /* The extra header space needed */
__be32 dst = tiph->daddr; __be32 dst = tiph->daddr;
@ -615,7 +614,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
skb_set_owner_w(new_skb, skb->sk); skb_set_owner_w(new_skb, skb->sk);
dev_kfree_skb(skb); dev_kfree_skb(skb);
skb = new_skb; skb = new_skb;
old_iph = skb->nh.iph; old_iph = ip_hdr(skb);
} }
skb->h.raw = skb->nh.raw; skb->h.raw = skb->nh.raw;
@ -631,7 +630,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
* Push down and install the IPIP header. * Push down and install the IPIP header.
*/ */
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->version = 4; iph->version = 4;
iph->ihl = sizeof(struct iphdr)>>2; iph->ihl = sizeof(struct iphdr)>>2;
iph->frag_off = df; iph->frag_off = df;

View File

@ -303,7 +303,7 @@ static void ipmr_destroy_unres(struct mfc_cache *c)
atomic_dec(&cache_resolve_queue_len); atomic_dec(&cache_resolve_queue_len);
while ((skb=skb_dequeue(&c->mfc_un.unres.unresolved))) { while ((skb=skb_dequeue(&c->mfc_un.unres.unresolved))) {
if (skb->nh.iph->version == 0) { if (ip_hdr(skb)->version == 0) {
struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr)); struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr));
nlh->nlmsg_type = NLMSG_ERROR; nlh->nlmsg_type = NLMSG_ERROR;
nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr)); nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));
@ -509,7 +509,7 @@ static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c)
*/ */
while ((skb=__skb_dequeue(&uc->mfc_un.unres.unresolved))) { while ((skb=__skb_dequeue(&uc->mfc_un.unres.unresolved))) {
if (skb->nh.iph->version == 0) { if (ip_hdr(skb)->version == 0) {
struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr)); struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr));
if (ipmr_fill_mroute(skb, c, NLMSG_DATA(nlh)) > 0) { if (ipmr_fill_mroute(skb, c, NLMSG_DATA(nlh)) > 0) {
@ -569,8 +569,9 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
msg->im_msgtype = IGMPMSG_WHOLEPKT; msg->im_msgtype = IGMPMSG_WHOLEPKT;
msg->im_mbz = 0; msg->im_mbz = 0;
msg->im_vif = reg_vif_num; msg->im_vif = reg_vif_num;
skb->nh.iph->ihl = sizeof(struct iphdr) >> 2; ip_hdr(skb)->ihl = sizeof(struct iphdr) >> 2;
skb->nh.iph->tot_len = htons(ntohs(pkt->nh.iph->tot_len) + sizeof(struct iphdr)); ip_hdr(skb)->tot_len = htons(ntohs(ip_hdr(pkt)->tot_len) +
sizeof(struct iphdr));
} else } else
#endif #endif
{ {
@ -579,10 +580,10 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
* Copy the IP header * Copy the IP header
*/ */
skb->nh.iph = (struct iphdr *)skb_put(skb, ihl); skb->nh.raw = skb_put(skb, ihl);
memcpy(skb->data,pkt->data,ihl); memcpy(skb->data,pkt->data,ihl);
skb->nh.iph->protocol = 0; /* Flag to the kernel this is a route add */ ip_hdr(skb)->protocol = 0; /* Flag to the kernel this is a route add */
msg = (struct igmpmsg*)skb->nh.iph; msg = (struct igmpmsg *)skb_network_header(skb);
msg->im_vif = vifi; msg->im_vif = vifi;
skb->dst = dst_clone(pkt->dst); skb->dst = dst_clone(pkt->dst);
@ -594,7 +595,7 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
igmp->type = igmp->type =
msg->im_msgtype = assert; msg->im_msgtype = assert;
igmp->code = 0; igmp->code = 0;
skb->nh.iph->tot_len=htons(skb->len); /* Fix the length */ ip_hdr(skb)->tot_len = htons(skb->len); /* Fix the length */
skb->h.raw = skb->nh.raw; skb->h.raw = skb->nh.raw;
} }
@ -624,11 +625,12 @@ ipmr_cache_unresolved(vifi_t vifi, struct sk_buff *skb)
{ {
int err; int err;
struct mfc_cache *c; struct mfc_cache *c;
const struct iphdr *iph = ip_hdr(skb);
spin_lock_bh(&mfc_unres_lock); spin_lock_bh(&mfc_unres_lock);
for (c=mfc_unres_queue; c; c=c->next) { for (c=mfc_unres_queue; c; c=c->next) {
if (c->mfc_mcastgrp == skb->nh.iph->daddr && if (c->mfc_mcastgrp == iph->daddr &&
c->mfc_origin == skb->nh.iph->saddr) c->mfc_origin == iph->saddr)
break; break;
} }
@ -648,9 +650,9 @@ ipmr_cache_unresolved(vifi_t vifi, struct sk_buff *skb)
/* /*
* Fill in the new cache entry * Fill in the new cache entry
*/ */
c->mfc_parent=-1; c->mfc_parent = -1;
c->mfc_origin=skb->nh.iph->saddr; c->mfc_origin = iph->saddr;
c->mfc_mcastgrp=skb->nh.iph->daddr; c->mfc_mcastgrp = iph->daddr;
/* /*
* Reflect first query at mrouted. * Reflect first query at mrouted.
@ -1096,12 +1098,12 @@ static struct notifier_block ip_mr_notifier={
static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr) static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr)
{ {
struct iphdr *iph; struct iphdr *iph;
struct iphdr *old_iph = skb->nh.iph; struct iphdr *old_iph = ip_hdr(skb);
skb_push(skb, sizeof(struct iphdr)); skb_push(skb, sizeof(struct iphdr));
skb->h.ipiph = skb->nh.iph; skb->h.raw = skb->nh.raw;
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->version = 4; iph->version = 4;
iph->tos = old_iph->tos; iph->tos = old_iph->tos;
@ -1137,7 +1139,7 @@ static inline int ipmr_forward_finish(struct sk_buff *skb)
static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi) static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)
{ {
struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
struct vif_device *vif = &vif_table[vifi]; struct vif_device *vif = &vif_table[vifi];
struct net_device *dev; struct net_device *dev;
struct rtable *rt; struct rtable *rt;
@ -1203,8 +1205,7 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)
dst_release(skb->dst); dst_release(skb->dst);
skb->dst = &rt->u.dst; skb->dst = &rt->u.dst;
iph = skb->nh.iph; ip_decrease_ttl(ip_hdr(skb));
ip_decrease_ttl(iph);
/* FIXME: forward and output firewalls used to be called here. /* FIXME: forward and output firewalls used to be called here.
* What do we do with netfilter? -- RR */ * What do we do with netfilter? -- RR */
@ -1304,7 +1305,7 @@ static int ip_mr_forward(struct sk_buff *skb, struct mfc_cache *cache, int local
* Forward the frame * Forward the frame
*/ */
for (ct = cache->mfc_un.res.maxvif-1; ct >= cache->mfc_un.res.minvif; ct--) { for (ct = cache->mfc_un.res.maxvif-1; ct >= cache->mfc_un.res.minvif; ct--) {
if (skb->nh.iph->ttl > cache->mfc_un.res.ttls[ct]) { if (ip_hdr(skb)->ttl > cache->mfc_un.res.ttls[ct]) {
if (psend != -1) { if (psend != -1) {
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
if (skb2) if (skb2)
@ -1350,7 +1351,7 @@ int ip_mr_input(struct sk_buff *skb)
if (IPCB(skb)->opt.router_alert) { if (IPCB(skb)->opt.router_alert) {
if (ip_call_ra_chain(skb)) if (ip_call_ra_chain(skb))
return 0; return 0;
} else if (skb->nh.iph->protocol == IPPROTO_IGMP){ } else if (ip_hdr(skb)->protocol == IPPROTO_IGMP){
/* IGMPv1 (and broken IGMPv2 implementations sort of /* IGMPv1 (and broken IGMPv2 implementations sort of
Cisco IOS <= 11.2(8)) do not put router alert Cisco IOS <= 11.2(8)) do not put router alert
option to IGMP packets destined to routable option to IGMP packets destined to routable
@ -1369,7 +1370,7 @@ int ip_mr_input(struct sk_buff *skb)
} }
read_lock(&mrt_lock); read_lock(&mrt_lock);
cache = ipmr_cache_find(skb->nh.iph->saddr, skb->nh.iph->daddr); cache = ipmr_cache_find(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr);
/* /*
* No usable cache entry * No usable cache entry
@ -1580,6 +1581,7 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
if (cache==NULL) { if (cache==NULL) {
struct sk_buff *skb2; struct sk_buff *skb2;
struct iphdr *iph;
struct net_device *dev; struct net_device *dev;
int vif; int vif;
@ -1601,10 +1603,11 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
skb_push(skb2, sizeof(struct iphdr)); skb_push(skb2, sizeof(struct iphdr));
skb_reset_network_header(skb2); skb_reset_network_header(skb2);
skb2->nh.iph->ihl = sizeof(struct iphdr)>>2; iph = ip_hdr(skb2);
skb2->nh.iph->saddr = rt->rt_src; iph->ihl = sizeof(struct iphdr) >> 2;
skb2->nh.iph->daddr = rt->rt_dst; iph->saddr = rt->rt_src;
skb2->nh.iph->version = 0; iph->daddr = rt->rt_dst;
iph->version = 0;
err = ipmr_cache_unresolved(vif, skb2); err = ipmr_cache_unresolved(vif, skb2);
read_unlock(&mrt_lock); read_unlock(&mrt_lock);
return err; return err;

View File

@ -577,7 +577,6 @@ static const struct file_operations ip_vs_app_fops = {
int ip_vs_skb_replace(struct sk_buff *skb, gfp_t pri, int ip_vs_skb_replace(struct sk_buff *skb, gfp_t pri,
char *o_buf, int o_len, char *n_buf, int n_len) char *o_buf, int o_len, char *n_buf, int n_len)
{ {
struct iphdr *iph;
int diff; int diff;
int o_offset; int o_offset;
int o_left; int o_left;
@ -607,8 +606,7 @@ int ip_vs_skb_replace(struct sk_buff *skb, gfp_t pri,
} }
/* must update the iph total length here */ /* must update the iph total length here */
iph = skb->nh.iph; ip_hdr(skb)->tot_len = htons(skb->len);
iph->tot_len = htons(skb->len);
LeaveFunction(9); LeaveFunction(9);
return 0; return 0;

View File

@ -212,7 +212,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
__be16 ports[2]) __be16 ports[2])
{ {
struct ip_vs_conn *cp = NULL; struct ip_vs_conn *cp = NULL;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_conn *ct; struct ip_vs_conn *ct;
__be16 dport; /* destination port to forward */ __be16 dport; /* destination port to forward */
@ -381,7 +381,7 @@ struct ip_vs_conn *
ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
{ {
struct ip_vs_conn *cp = NULL; struct ip_vs_conn *cp = NULL;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
__be16 _ports[2], *pptr; __be16 _ports[2], *pptr;
@ -447,7 +447,7 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,
struct ip_vs_protocol *pp) struct ip_vs_protocol *pp)
{ {
__be16 _ports[2], *pptr; __be16 _ports[2], *pptr;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
pptr = skb_header_pointer(skb, iph->ihl*4, pptr = skb_header_pointer(skb, iph->ihl*4,
sizeof(_ports), _ports); sizeof(_ports), _ports);
@ -546,7 +546,7 @@ ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user)
{ {
skb = ip_defrag(skb, user); skb = ip_defrag(skb, user);
if (skb) if (skb)
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
return skb; return skb;
} }
@ -557,7 +557,7 @@ ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user)
void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp, void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
struct ip_vs_conn *cp, int inout) struct ip_vs_conn *cp, int inout)
{ {
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
unsigned int icmp_offset = iph->ihl*4; unsigned int icmp_offset = iph->ihl*4;
struct icmphdr *icmph = (struct icmphdr *)(skb_network_header(skb) + struct icmphdr *icmph = (struct icmphdr *)(skb_network_header(skb) +
icmp_offset); icmp_offset);
@ -618,14 +618,14 @@ static int ip_vs_out_icmp(struct sk_buff **pskb, int *related)
*related = 1; *related = 1;
/* reassemble IP fragments */ /* reassemble IP fragments */
if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT); skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT);
if (!skb) if (!skb)
return NF_STOLEN; return NF_STOLEN;
*pskb = skb; *pskb = skb;
} }
iph = skb->nh.iph; iph = ip_hdr(skb);
offset = ihl = iph->ihl * 4; offset = ihl = iph->ihl * 4;
ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph); ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
if (ic == NULL) if (ic == NULL)
@ -740,14 +740,14 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
if (skb->ipvs_property) if (skb->ipvs_property)
return NF_ACCEPT; return NF_ACCEPT;
iph = skb->nh.iph; iph = ip_hdr(skb);
if (unlikely(iph->protocol == IPPROTO_ICMP)) { if (unlikely(iph->protocol == IPPROTO_ICMP)) {
int related, verdict = ip_vs_out_icmp(pskb, &related); int related, verdict = ip_vs_out_icmp(pskb, &related);
if (related) if (related)
return verdict; return verdict;
skb = *pskb; skb = *pskb;
iph = skb->nh.iph; iph = ip_hdr(skb);
} }
pp = ip_vs_proto_get(iph->protocol); pp = ip_vs_proto_get(iph->protocol);
@ -760,7 +760,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT); skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT);
if (!skb) if (!skb)
return NF_STOLEN; return NF_STOLEN;
iph = skb->nh.iph; iph = ip_hdr(skb);
*pskb = skb; *pskb = skb;
} }
@ -810,8 +810,8 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
if (pp->snat_handler && !pp->snat_handler(pskb, pp, cp)) if (pp->snat_handler && !pp->snat_handler(pskb, pp, cp))
goto drop; goto drop;
skb = *pskb; skb = *pskb;
skb->nh.iph->saddr = cp->vaddr; ip_hdr(skb)->saddr = cp->vaddr;
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
/* For policy routing, packets originating from this /* For policy routing, packets originating from this
* machine itself may be routed differently to packets * machine itself may be routed differently to packets
@ -861,7 +861,7 @@ ip_vs_in_icmp(struct sk_buff **pskb, int *related, unsigned int hooknum)
*related = 1; *related = 1;
/* reassemble IP fragments */ /* reassemble IP fragments */
if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
skb = ip_vs_gather_frags(skb, skb = ip_vs_gather_frags(skb,
hooknum == NF_IP_LOCAL_IN ? hooknum == NF_IP_LOCAL_IN ?
IP_DEFRAG_VS_IN : IP_DEFRAG_VS_FWD); IP_DEFRAG_VS_IN : IP_DEFRAG_VS_FWD);
@ -870,7 +870,7 @@ ip_vs_in_icmp(struct sk_buff **pskb, int *related, unsigned int hooknum)
*pskb = skb; *pskb = skb;
} }
iph = skb->nh.iph; iph = ip_hdr(skb);
offset = ihl = iph->ihl * 4; offset = ihl = iph->ihl * 4;
ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph); ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
if (ic == NULL) if (ic == NULL)
@ -966,19 +966,19 @@ ip_vs_in(unsigned int hooknum, struct sk_buff **pskb,
|| skb->dev == &loopback_dev || skb->sk)) { || skb->dev == &loopback_dev || skb->sk)) {
IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n", IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n",
skb->pkt_type, skb->pkt_type,
skb->nh.iph->protocol, ip_hdr(skb)->protocol,
NIPQUAD(skb->nh.iph->daddr)); NIPQUAD(ip_hdr(skb)->daddr));
return NF_ACCEPT; return NF_ACCEPT;
} }
iph = skb->nh.iph; iph = ip_hdr(skb);
if (unlikely(iph->protocol == IPPROTO_ICMP)) { if (unlikely(iph->protocol == IPPROTO_ICMP)) {
int related, verdict = ip_vs_in_icmp(pskb, &related, hooknum); int related, verdict = ip_vs_in_icmp(pskb, &related, hooknum);
if (related) if (related)
return verdict; return verdict;
skb = *pskb; skb = *pskb;
iph = skb->nh.iph; iph = ip_hdr(skb);
} }
/* Protocol supported? */ /* Protocol supported? */
@ -1064,7 +1064,7 @@ ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff **pskb,
{ {
int r; int r;
if ((*pskb)->nh.iph->protocol != IPPROTO_ICMP) if (ip_hdr(*pskb)->protocol != IPPROTO_ICMP)
return NF_ACCEPT; return NF_ACCEPT;
return ip_vs_in_icmp(pskb, &r, hooknum); return ip_vs_in_icmp(pskb, &r, hooknum);

View File

@ -204,7 +204,7 @@ ip_vs_dh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
{ {
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_dh_bucket *tbl; struct ip_vs_dh_bucket *tbl;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
IP_VS_DBG(6, "ip_vs_dh_schedule(): Scheduling...\n"); IP_VS_DBG(6, "ip_vs_dh_schedule(): Scheduling...\n");

View File

@ -159,7 +159,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
return 0; return 0;
if (cp->app_data == &ip_vs_ftp_pasv) { if (cp->app_data == &ip_vs_ftp_pasv) {
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]);
data = (char *)th + (th->doff << 2); data = (char *)th + (th->doff << 2);
data_limit = (*pskb)->tail; data_limit = (*pskb)->tail;
@ -262,7 +262,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
/* /*
* Detecting whether it is passive * Detecting whether it is passive
*/ */
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]);
/* Since there may be OPTIONS in the TCP packet and the HLEN is /* Since there may be OPTIONS in the TCP packet and the HLEN is

View File

@ -521,7 +521,7 @@ ip_vs_lblc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_lblc_table *tbl; struct ip_vs_lblc_table *tbl;
struct ip_vs_lblc_entry *en; struct ip_vs_lblc_entry *en;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
IP_VS_DBG(6, "ip_vs_lblc_schedule(): Scheduling...\n"); IP_VS_DBG(6, "ip_vs_lblc_schedule(): Scheduling...\n");

View File

@ -775,7 +775,7 @@ ip_vs_lblcr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_lblcr_table *tbl; struct ip_vs_lblcr_table *tbl;
struct ip_vs_lblcr_entry *en; struct ip_vs_lblcr_entry *en;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
IP_VS_DBG(6, "ip_vs_lblcr_schedule(): Scheduling...\n"); IP_VS_DBG(6, "ip_vs_lblcr_schedule(): Scheduling...\n");

View File

@ -83,8 +83,8 @@ tcp_conn_schedule(struct sk_buff *skb,
} }
if (th->syn && if (th->syn &&
(svc = ip_vs_service_get(skb->mark, skb->nh.iph->protocol, (svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
skb->nh.iph->daddr, th->dest))) { ip_hdr(skb)->daddr, th->dest))) {
if (ip_vs_todrop()) { if (ip_vs_todrop()) {
/* /*
* It seems that we are very loaded. * It seems that we are very loaded.
@ -142,7 +142,7 @@ tcp_snat_handler(struct sk_buff **pskb,
return 0; return 0;
} }
tcph = (void *)(*pskb)->nh.iph + tcphoff; tcph = (void *)ip_hdr(*pskb) + tcphoff;
tcph->source = cp->vport; tcph->source = cp->vport;
/* Adjust TCP checksums */ /* Adjust TCP checksums */
@ -193,7 +193,7 @@ tcp_dnat_handler(struct sk_buff **pskb,
return 0; return 0;
} }
tcph = (void *)(*pskb)->nh.iph + tcphoff; tcph = (void *)ip_hdr(*pskb) + tcphoff;
tcph->dest = cp->dport; tcph->dest = cp->dport;
/* /*
@ -229,9 +229,9 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
case CHECKSUM_NONE: case CHECKSUM_NONE:
skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0); skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0);
case CHECKSUM_COMPLETE: case CHECKSUM_COMPLETE:
if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, if (csum_tcpudp_magic(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
skb->len - tcphoff, skb->len - tcphoff,
skb->nh.iph->protocol, skb->csum)) { ip_hdr(skb)->protocol, skb->csum)) {
IP_VS_DBG_RL_PKT(0, pp, skb, 0, IP_VS_DBG_RL_PKT(0, pp, skb, 0,
"Failed checksum for"); "Failed checksum for");
return 0; return 0;

View File

@ -89,8 +89,8 @@ udp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,
return 0; return 0;
} }
if ((svc = ip_vs_service_get(skb->mark, skb->nh.iph->protocol, if ((svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
skb->nh.iph->daddr, uh->dest))) { ip_hdr(skb)->daddr, uh->dest))) {
if (ip_vs_todrop()) { if (ip_vs_todrop()) {
/* /*
* It seems that we are very loaded. * It seems that we are very loaded.
@ -151,7 +151,7 @@ udp_snat_handler(struct sk_buff **pskb,
return 0; return 0;
} }
udph = (void *)(*pskb)->nh.iph + udphoff; udph = (void *)ip_hdr(*pskb) + udphoff;
udph->source = cp->vport; udph->source = cp->vport;
/* /*
@ -206,7 +206,7 @@ udp_dnat_handler(struct sk_buff **pskb,
return 0; return 0;
} }
udph = (void *)(*pskb)->nh.iph + udphoff; udph = (void *)ip_hdr(*pskb) + udphoff;
udph->dest = cp->dport; udph->dest = cp->dport;
/* /*
@ -251,10 +251,10 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
skb->csum = skb_checksum(skb, udphoff, skb->csum = skb_checksum(skb, udphoff,
skb->len - udphoff, 0); skb->len - udphoff, 0);
case CHECKSUM_COMPLETE: case CHECKSUM_COMPLETE:
if (csum_tcpudp_magic(skb->nh.iph->saddr, if (csum_tcpudp_magic(ip_hdr(skb)->saddr,
skb->nh.iph->daddr, ip_hdr(skb)->daddr,
skb->len - udphoff, skb->len - udphoff,
skb->nh.iph->protocol, ip_hdr(skb)->protocol,
skb->csum)) { skb->csum)) {
IP_VS_DBG_RL_PKT(0, pp, skb, 0, IP_VS_DBG_RL_PKT(0, pp, skb, 0,
"Failed checksum for"); "Failed checksum for");

View File

@ -201,7 +201,7 @@ ip_vs_sh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
{ {
struct ip_vs_dest *dest; struct ip_vs_dest *dest;
struct ip_vs_sh_bucket *tbl; struct ip_vs_sh_bucket *tbl;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n"); IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n");

View File

@ -156,7 +156,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
struct ip_vs_protocol *pp) struct ip_vs_protocol *pp)
{ {
struct rtable *rt; /* Route to the other host */ struct rtable *rt; /* Route to the other host */
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
u8 tos = iph->tos; u8 tos = iph->tos;
int mtu; int mtu;
struct flowi fl = { struct flowi fl = {
@ -193,7 +193,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
ip_rt_put(rt); ip_rt_put(rt);
return NF_STOLEN; return NF_STOLEN;
} }
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
/* drop old route */ /* drop old route */
dst_release(skb->dst); dst_release(skb->dst);
@ -226,7 +226,7 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
{ {
struct rtable *rt; /* Route to the other host */ struct rtable *rt; /* Route to the other host */
int mtu; int mtu;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
EnterFunction(10); EnterFunction(10);
@ -266,8 +266,8 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
/* mangle the packet */ /* mangle the packet */
if (pp->dnat_handler && !pp->dnat_handler(&skb, pp, cp)) if (pp->dnat_handler && !pp->dnat_handler(&skb, pp, cp))
goto tx_error; goto tx_error;
skb->nh.iph->daddr = cp->daddr; ip_hdr(skb)->daddr = cp->daddr;
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
IP_VS_DBG_PKT(10, pp, skb, 0, "After DNAT"); IP_VS_DBG_PKT(10, pp, skb, 0, "After DNAT");
@ -320,7 +320,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
{ {
struct rtable *rt; /* Route to the other host */ struct rtable *rt; /* Route to the other host */
struct net_device *tdev; /* Device to other host */ struct net_device *tdev; /* Device to other host */
struct iphdr *old_iph = skb->nh.iph; struct iphdr *old_iph = ip_hdr(skb);
u8 tos = old_iph->tos; u8 tos = old_iph->tos;
__be16 df = old_iph->frag_off; __be16 df = old_iph->frag_off;
struct iphdr *iph; /* Our new IP header */ struct iphdr *iph; /* Our new IP header */
@ -377,7 +377,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
} }
kfree_skb(skb); kfree_skb(skb);
skb = new_skb; skb = new_skb;
old_iph = skb->nh.iph; old_iph = ip_hdr(skb);
} }
skb->h.raw = (void *) old_iph; skb->h.raw = (void *) old_iph;
@ -396,7 +396,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
/* /*
* Push down and install the IPIP header. * Push down and install the IPIP header.
*/ */
iph = skb->nh.iph; iph = ip_hdr(skb);
iph->version = 4; iph->version = 4;
iph->ihl = sizeof(struct iphdr)>>2; iph->ihl = sizeof(struct iphdr)>>2;
iph->frag_off = df; iph->frag_off = df;
@ -436,7 +436,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
struct ip_vs_protocol *pp) struct ip_vs_protocol *pp)
{ {
struct rtable *rt; /* Route to the other host */ struct rtable *rt; /* Route to the other host */
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
int mtu; int mtu;
EnterFunction(10); EnterFunction(10);
@ -461,7 +461,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
ip_rt_put(rt); ip_rt_put(rt);
return NF_STOLEN; return NF_STOLEN;
} }
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
/* drop old route */ /* drop old route */
dst_release(skb->dst); dst_release(skb->dst);
@ -515,12 +515,12 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
* mangle and send the packet here (only for VS/NAT) * mangle and send the packet here (only for VS/NAT)
*/ */
if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(skb->nh.iph->tos)))) if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(ip_hdr(skb)->tos))))
goto tx_error_icmp; goto tx_error_icmp;
/* MTU checking */ /* MTU checking */
mtu = dst_mtu(&rt->u.dst); mtu = dst_mtu(&rt->u.dst);
if ((skb->len > mtu) && (skb->nh.iph->frag_off & htons(IP_DF))) { if ((skb->len > mtu) && (ip_hdr(skb)->frag_off & htons(IP_DF))) {
ip_rt_put(rt); ip_rt_put(rt);
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n"); IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n");

View File

@ -10,7 +10,7 @@
/* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */ /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */
int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type) int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type)
{ {
struct iphdr *iph = (*pskb)->nh.iph; const struct iphdr *iph = ip_hdr(*pskb);
struct rtable *rt; struct rtable *rt;
struct flowi fl = {}; struct flowi fl = {};
struct dst_entry *odst; struct dst_entry *odst;
@ -142,7 +142,7 @@ static void nf_ip_saveroute(const struct sk_buff *skb, struct nf_info *info)
struct ip_rt_info *rt_info = nf_info_reroute(info); struct ip_rt_info *rt_info = nf_info_reroute(info);
if (info->hook == NF_IP_LOCAL_OUT) { if (info->hook == NF_IP_LOCAL_OUT) {
const struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
rt_info->tos = iph->tos; rt_info->tos = iph->tos;
rt_info->daddr = iph->daddr; rt_info->daddr = iph->daddr;
@ -155,7 +155,7 @@ static int nf_ip_reroute(struct sk_buff **pskb, const struct nf_info *info)
const struct ip_rt_info *rt_info = nf_info_reroute(info); const struct ip_rt_info *rt_info = nf_info_reroute(info);
if (info->hook == NF_IP_LOCAL_OUT) { if (info->hook == NF_IP_LOCAL_OUT) {
struct iphdr *iph = (*pskb)->nh.iph; const struct iphdr *iph = ip_hdr(*pskb);
if (!(iph->tos == rt_info->tos if (!(iph->tos == rt_info->tos
&& iph->daddr == rt_info->daddr && iph->daddr == rt_info->daddr
@ -168,7 +168,7 @@ static int nf_ip_reroute(struct sk_buff **pskb, const struct nf_info *info)
__sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook,
unsigned int dataoff, u_int8_t protocol) unsigned int dataoff, u_int8_t protocol)
{ {
struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
__sum16 csum = 0; __sum16 csum = 0;
switch (skb->ip_summed) { switch (skb->ip_summed) {

View File

@ -748,9 +748,9 @@ resolve_normal_ct(struct sk_buff *skb,
struct ip_conntrack_tuple_hash *h; struct ip_conntrack_tuple_hash *h;
struct ip_conntrack *ct; struct ip_conntrack *ct;
IP_NF_ASSERT((skb->nh.iph->frag_off & htons(IP_OFFSET)) == 0); IP_NF_ASSERT((ip_hdr(skb)->frag_off & htons(IP_OFFSET)) == 0);
if (!ip_ct_get_tuple(skb->nh.iph, skb, ip_hdrlen(skb), &tuple,proto)) if (!ip_ct_get_tuple(ip_hdr(skb), skb, ip_hdrlen(skb), &tuple,proto))
return NULL; return NULL;
/* look for tuple match */ /* look for tuple match */
@ -811,10 +811,10 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
} }
/* Never happen */ /* Never happen */
if ((*pskb)->nh.iph->frag_off & htons(IP_OFFSET)) { if (ip_hdr(*pskb)->frag_off & htons(IP_OFFSET)) {
if (net_ratelimit()) { if (net_ratelimit()) {
printk(KERN_ERR "ip_conntrack_in: Frag of proto %u (hook=%u)\n", printk(KERN_ERR "ip_conntrack_in: Frag of proto %u (hook=%u)\n",
(*pskb)->nh.iph->protocol, hooknum); ip_hdr(*pskb)->protocol, hooknum);
} }
return NF_DROP; return NF_DROP;
} }
@ -825,17 +825,17 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
if ((*pskb)->pkt_type == PACKET_BROADCAST) { if ((*pskb)->pkt_type == PACKET_BROADCAST) {
printk("Broadcast packet!\n"); printk("Broadcast packet!\n");
return NF_ACCEPT; return NF_ACCEPT;
} else if (((*pskb)->nh.iph->daddr & htonl(0x000000FF)) } else if ((ip_hdr(*pskb)->daddr & htonl(0x000000FF))
== htonl(0x000000FF)) { == htonl(0x000000FF)) {
printk("Should bcast: %u.%u.%u.%u->%u.%u.%u.%u (sk=%p, ptype=%u)\n", printk("Should bcast: %u.%u.%u.%u->%u.%u.%u.%u (sk=%p, ptype=%u)\n",
NIPQUAD((*pskb)->nh.iph->saddr), NIPQUAD(ip_hdr(*pskb)->saddr),
NIPQUAD((*pskb)->nh.iph->daddr), NIPQUAD(ip_hdr(*pskb)->daddr),
(*pskb)->sk, (*pskb)->pkt_type); (*pskb)->sk, (*pskb)->pkt_type);
} }
#endif #endif
/* rcu_read_lock()ed by nf_hook_slow */ /* rcu_read_lock()ed by nf_hook_slow */
proto = __ip_conntrack_proto_find((*pskb)->nh.iph->protocol); proto = __ip_conntrack_proto_find(ip_hdr(*pskb)->protocol);
/* It may be an special packet, error, unclean... /* It may be an special packet, error, unclean...
* inverse of the return code tells to the netfilter * inverse of the return code tells to the netfilter
@ -1152,7 +1152,7 @@ void __ip_ct_refresh_acct(struct ip_conntrack *ct,
if (do_acct) { if (do_acct) {
ct->counters[CTINFO2DIR(ctinfo)].packets++; ct->counters[CTINFO2DIR(ctinfo)].packets++;
ct->counters[CTINFO2DIR(ctinfo)].bytes += ct->counters[CTINFO2DIR(ctinfo)].bytes +=
ntohs(skb->nh.iph->tot_len); ntohs(ip_hdr(skb)->tot_len);
if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000)
|| (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000))
event |= IPCT_COUNTER_FILLING; event |= IPCT_COUNTER_FILLING;
@ -1210,7 +1210,7 @@ ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user)
local_bh_enable(); local_bh_enable();
if (skb) if (skb)
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
return skb; return skb;
} }

View File

@ -576,8 +576,8 @@ static int h245_help(struct sk_buff **pskb, struct ip_conntrack *ct,
/* Process each TPKT */ /* Process each TPKT */
while (get_tpkt_data(pskb, ct, ctinfo, &data, &datalen, &dataoff)) { while (get_tpkt_data(pskb, ct, ctinfo, &data, &datalen, &dataoff)) {
DEBUGP("ip_ct_h245: TPKT %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n", DEBUGP("ip_ct_h245: TPKT %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n",
NIPQUAD((*pskb)->nh.iph->saddr), NIPQUAD(ip_hdr(*pskb)->saddr),
NIPQUAD((*pskb)->nh.iph->daddr), datalen); NIPQUAD(ip_hdr(*pskb)->daddr), datalen);
/* Decode H.245 signal */ /* Decode H.245 signal */
ret = DecodeMultimediaSystemControlMessage(data, datalen, ret = DecodeMultimediaSystemControlMessage(data, datalen,
@ -1128,8 +1128,8 @@ static int q931_help(struct sk_buff **pskb, struct ip_conntrack *ct,
/* Process each TPKT */ /* Process each TPKT */
while (get_tpkt_data(pskb, ct, ctinfo, &data, &datalen, &dataoff)) { while (get_tpkt_data(pskb, ct, ctinfo, &data, &datalen, &dataoff)) {
DEBUGP("ip_ct_q931: TPKT %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n", DEBUGP("ip_ct_q931: TPKT %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n",
NIPQUAD((*pskb)->nh.iph->saddr), NIPQUAD(ip_hdr(*pskb)->saddr),
NIPQUAD((*pskb)->nh.iph->daddr), datalen); NIPQUAD(ip_hdr(*pskb)->daddr), datalen);
/* Decode Q.931 signal */ /* Decode Q.931 signal */
ret = DecodeQ931(data, datalen, &q931); ret = DecodeQ931(data, datalen, &q931);
@ -1741,8 +1741,8 @@ static int ras_help(struct sk_buff **pskb, struct ip_conntrack *ct,
if (data == NULL) if (data == NULL)
goto accept; goto accept;
DEBUGP("ip_ct_ras: RAS message %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n", DEBUGP("ip_ct_ras: RAS message %u.%u.%u.%u->%u.%u.%u.%u, len=%d\n",
NIPQUAD((*pskb)->nh.iph->saddr), NIPQUAD(ip_hdr(*pskb)->saddr),
NIPQUAD((*pskb)->nh.iph->daddr), datalen); NIPQUAD(ip_hdr(*pskb)->daddr), datalen);
/* Decode RAS message */ /* Decode RAS message */
ret = DecodeRasMessage(data, datalen, &ras); ret = DecodeRasMessage(data, datalen, &ras);

View File

@ -45,7 +45,7 @@ static int help(struct sk_buff **pskb,
struct ip_conntrack *ct, enum ip_conntrack_info ctinfo) struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
{ {
struct ip_conntrack_expect *exp; struct ip_conntrack_expect *exp;
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
struct rtable *rt = (struct rtable *)(*pskb)->dst; struct rtable *rt = (struct rtable *)(*pskb)->dst;
struct in_device *in_dev; struct in_device *in_dev;
__be32 mask = 0; __be32 mask = 0;

View File

@ -316,7 +316,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
enum ip_conntrack_info ctinfo) enum ip_conntrack_info ctinfo)
{ {
enum sctp_conntrack newconntrack, oldsctpstate; enum sctp_conntrack newconntrack, oldsctpstate;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
sctp_sctphdr_t _sctph, *sh; sctp_sctphdr_t _sctph, *sh;
sctp_chunkhdr_t _sch, *sch; sctp_chunkhdr_t _sch, *sch;
u_int32_t offset, count; u_int32_t offset, count;
@ -430,7 +430,7 @@ static int sctp_new(struct ip_conntrack *conntrack,
const struct sk_buff *skb) const struct sk_buff *skb)
{ {
enum sctp_conntrack newconntrack; enum sctp_conntrack newconntrack;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
sctp_sctphdr_t _sctph, *sh; sctp_sctphdr_t _sctph, *sh;
sctp_chunkhdr_t _sch, *sch; sctp_chunkhdr_t _sch, *sch;
u_int32_t offset, count; u_int32_t offset, count;

View File

@ -770,8 +770,8 @@ void ip_conntrack_tcp_update(struct sk_buff *skb,
struct ip_conntrack *conntrack, struct ip_conntrack *conntrack,
enum ip_conntrack_dir dir) enum ip_conntrack_dir dir)
{ {
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct tcphdr *tcph = (void *)skb->nh.iph + ip_hdrlen(skb); struct tcphdr *tcph = (void *)iph + ip_hdrlen(skb);
__u32 end; __u32 end;
#ifdef DEBUGP_VARS #ifdef DEBUGP_VARS
struct ip_ct_tcp_state *sender = &conntrack->proto.tcp.seen[dir]; struct ip_ct_tcp_state *sender = &conntrack->proto.tcp.seen[dir];
@ -834,13 +834,13 @@ static int tcp_error(struct sk_buff *skb,
enum ip_conntrack_info *ctinfo, enum ip_conntrack_info *ctinfo,
unsigned int hooknum) unsigned int hooknum)
{ {
struct iphdr *iph = skb->nh.iph; const unsigned int hdrlen = ip_hdrlen(skb);
struct tcphdr _tcph, *th; struct tcphdr _tcph, *th;
unsigned int tcplen = skb->len - iph->ihl * 4; unsigned int tcplen = skb->len - hdrlen;
u_int8_t tcpflags; u_int8_t tcpflags;
/* Smaller that minimal TCP header? */ /* Smaller that minimal TCP header? */
th = skb_header_pointer(skb, iph->ihl * 4, th = skb_header_pointer(skb, hdrlen,
sizeof(_tcph), &_tcph); sizeof(_tcph), &_tcph);
if (th == NULL) { if (th == NULL) {
if (LOG_INVALID(IPPROTO_TCP)) if (LOG_INVALID(IPPROTO_TCP))
@ -863,7 +863,7 @@ static int tcp_error(struct sk_buff *skb,
*/ */
/* FIXME: Source route IP option packets --RR */ /* FIXME: Source route IP option packets --RR */
if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING &&
nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_TCP)) { nf_ip_checksum(skb, hooknum, hdrlen, IPPROTO_TCP)) {
if (LOG_INVALID(IPPROTO_TCP)) if (LOG_INVALID(IPPROTO_TCP))
nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
"ip_ct_tcp: bad TCP checksum "); "ip_ct_tcp: bad TCP checksum ");
@ -889,7 +889,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
{ {
enum tcp_conntrack new_state, old_state; enum tcp_conntrack new_state, old_state;
enum ip_conntrack_dir dir; enum ip_conntrack_dir dir;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct tcphdr *th, _tcph; struct tcphdr *th, _tcph;
unsigned long timeout; unsigned long timeout;
unsigned int index; unsigned int index;
@ -1062,7 +1062,7 @@ static int tcp_new(struct ip_conntrack *conntrack,
const struct sk_buff *skb) const struct sk_buff *skb)
{ {
enum tcp_conntrack new_state; enum tcp_conntrack new_state;
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
struct tcphdr *th, _tcph; struct tcphdr *th, _tcph;
#ifdef DEBUGP_VARS #ifdef DEBUGP_VARS
struct ip_ct_tcp_state *sender = &conntrack->proto.tcp.seen[0]; struct ip_ct_tcp_state *sender = &conntrack->proto.tcp.seen[0];

View File

@ -89,12 +89,12 @@ static int udp_new(struct ip_conntrack *conntrack, const struct sk_buff *skb)
static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
unsigned int hooknum) unsigned int hooknum)
{ {
struct iphdr *iph = skb->nh.iph; const unsigned int hdrlen = ip_hdrlen(skb);
unsigned int udplen = skb->len - iph->ihl * 4; unsigned int udplen = skb->len - hdrlen;
struct udphdr _hdr, *hdr; struct udphdr _hdr, *hdr;
/* Header is too small? */ /* Header is too small? */
hdr = skb_header_pointer(skb, iph->ihl*4, sizeof(_hdr), &_hdr); hdr = skb_header_pointer(skb, hdrlen, sizeof(_hdr), &_hdr);
if (hdr == NULL) { if (hdr == NULL) {
if (LOG_INVALID(IPPROTO_UDP)) if (LOG_INVALID(IPPROTO_UDP))
nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
@ -119,7 +119,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
* because the checksum is assumed to be correct. * because the checksum is assumed to be correct.
* FIXME: Source route IP option packets --RR */ * FIXME: Source route IP option packets --RR */
if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING &&
nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) { nf_ip_checksum(skb, hooknum, hdrlen, IPPROTO_UDP)) {
if (LOG_INVALID(IPPROTO_UDP)) if (LOG_INVALID(IPPROTO_UDP))
nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
"ip_ct_udp: bad UDP checksum "); "ip_ct_udp: bad UDP checksum ");

View File

@ -439,7 +439,7 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum,
#endif #endif
/* Gather fragments. */ /* Gather fragments. */
if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) {
*pskb = ip_ct_gather_frags(*pskb, *pskb = ip_ct_gather_frags(*pskb,
hooknum == NF_IP_PRE_ROUTING ? hooknum == NF_IP_PRE_ROUTING ?
IP_DEFRAG_CONNTRACK_IN : IP_DEFRAG_CONNTRACK_IN :

View File

@ -94,7 +94,7 @@ static void mangle_contents(struct sk_buff *skb,
unsigned char *data; unsigned char *data;
BUG_ON(skb_is_nonlinear(skb)); BUG_ON(skb_is_nonlinear(skb));
data = (unsigned char *)skb->nh.iph + dataoff; data = skb_network_header(skb) + dataoff;
/* move post-replacement */ /* move post-replacement */
memmove(data + match_offset + rep_len, memmove(data + match_offset + rep_len,
@ -118,8 +118,8 @@ static void mangle_contents(struct sk_buff *skb,
} }
/* fix IP hdr checksum information */ /* fix IP hdr checksum information */
skb->nh.iph->tot_len = htons(skb->len); ip_hdr(skb)->tot_len = htons(skb->len);
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
} }
/* Unusual, but possible case. */ /* Unusual, but possible case. */
@ -173,7 +173,7 @@ ip_nat_mangle_tcp_packet(struct sk_buff **pskb,
SKB_LINEAR_ASSERT(*pskb); SKB_LINEAR_ASSERT(*pskb);
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
tcph = (void *)iph + iph->ihl*4; tcph = (void *)iph + iph->ihl*4;
oldlen = (*pskb)->len - iph->ihl*4; oldlen = (*pskb)->len - iph->ihl*4;
@ -227,7 +227,7 @@ ip_nat_mangle_udp_packet(struct sk_buff **pskb,
int datalen, oldlen; int datalen, oldlen;
/* UDP helpers might accidentally mangle the wrong packet */ /* UDP helpers might accidentally mangle the wrong packet */
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) + if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) +
match_offset + match_len) match_offset + match_len)
return 0; return 0;
@ -240,7 +240,7 @@ ip_nat_mangle_udp_packet(struct sk_buff **pskb,
&& !enlarge_skb(pskb, rep_len - match_len)) && !enlarge_skb(pskb, rep_len - match_len))
return 0; return 0;
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
udph = (void *)iph + iph->ihl*4; udph = (void *)iph + iph->ihl*4;
oldlen = (*pskb)->len - iph->ihl*4; oldlen = (*pskb)->len - iph->ihl*4;

View File

@ -46,7 +46,7 @@ static int set_addr(struct sk_buff **pskb,
buf.port = htons(port); buf.port = htons(port);
addroff += dataoff; addroff += dataoff;
if ((*pskb)->nh.iph->protocol == IPPROTO_TCP) { if (ip_hdr(*pskb)->protocol == IPPROTO_TCP) {
if (!ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, if (!ip_nat_mangle_tcp_packet(pskb, ct, ctinfo,
addroff, sizeof(buf), addroff, sizeof(buf),
(char *) &buf, sizeof(buf))) { (char *) &buf, sizeof(buf))) {

View File

@ -158,7 +158,7 @@ static unsigned int ipt_dnat_target(struct sk_buff **pskb,
if (hooknum == NF_IP_LOCAL_OUT if (hooknum == NF_IP_LOCAL_OUT
&& mr->range[0].flags & IP_NAT_RANGE_MAP_IPS) && mr->range[0].flags & IP_NAT_RANGE_MAP_IPS)
warn_if_extra_mangle((*pskb)->nh.iph->daddr, warn_if_extra_mangle(ip_hdr(*pskb)->daddr,
mr->range[0].min_ip); mr->range[0].min_ip);
return ip_nat_setup_info(ct, &mr->range[0], hooknum); return ip_nat_setup_info(ct, &mr->range[0], hooknum);

View File

@ -1193,7 +1193,7 @@ static int snmp_translate(struct ip_conntrack *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
struct sk_buff **pskb) struct sk_buff **pskb)
{ {
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl); struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
u_int16_t udplen = ntohs(udph->len); u_int16_t udplen = ntohs(udph->len);
u_int16_t paylen = udplen - sizeof(struct udphdr); u_int16_t paylen = udplen - sizeof(struct udphdr);
@ -1234,7 +1234,7 @@ static int help(struct sk_buff **pskb,
{ {
int dir = CTINFO2DIR(ctinfo); int dir = CTINFO2DIR(ctinfo);
unsigned int ret; unsigned int ret;
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl); struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl);
/* SNMP replies and originating SNMP traps get mangled */ /* SNMP replies and originating SNMP traps get mangled */

View File

@ -97,7 +97,7 @@ ip_nat_fn(unsigned int hooknum,
/* We never see fragments: conntrack defrags on pre-routing /* We never see fragments: conntrack defrags on pre-routing
and local-out, and ip_nat_out protects post-routing. */ and local-out, and ip_nat_out protects post-routing. */
IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off IP_NF_ASSERT(!(ip_hdr(*pskb)->frag_off
& htons(IP_MF|IP_OFFSET))); & htons(IP_MF|IP_OFFSET)));
ct = ip_conntrack_get(*pskb, &ctinfo); ct = ip_conntrack_get(*pskb, &ctinfo);
@ -109,7 +109,7 @@ ip_nat_fn(unsigned int hooknum,
/* Exception: ICMP redirect to new connection (not in /* Exception: ICMP redirect to new connection (not in
hash table yet). We must not let this through, in hash table yet). We must not let this through, in
case we're doing NAT to the same network. */ case we're doing NAT to the same network. */
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP) {
struct icmphdr _hdr, *hp; struct icmphdr _hdr, *hp;
hp = skb_header_pointer(*pskb, ip_hdrlen(*pskb), hp = skb_header_pointer(*pskb, ip_hdrlen(*pskb),
@ -128,7 +128,7 @@ ip_nat_fn(unsigned int hooknum,
switch (ctinfo) { switch (ctinfo) {
case IP_CT_RELATED: case IP_CT_RELATED:
case IP_CT_RELATED+IP_CT_IS_REPLY: case IP_CT_RELATED+IP_CT_IS_REPLY:
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP) {
if (!ip_nat_icmp_reply_translation(ct, ctinfo, if (!ip_nat_icmp_reply_translation(ct, ctinfo,
hooknum, pskb)) hooknum, pskb))
return NF_DROP; return NF_DROP;
@ -184,11 +184,11 @@ ip_nat_in(unsigned int hooknum,
int (*okfn)(struct sk_buff *)) int (*okfn)(struct sk_buff *))
{ {
unsigned int ret; unsigned int ret;
__be32 daddr = (*pskb)->nh.iph->daddr; __be32 daddr = ip_hdr(*pskb)->daddr;
ret = ip_nat_fn(hooknum, pskb, in, out, okfn); ret = ip_nat_fn(hooknum, pskb, in, out, okfn);
if (ret != NF_DROP && ret != NF_STOLEN if (ret != NF_DROP && ret != NF_STOLEN
&& daddr != (*pskb)->nh.iph->daddr) { && daddr != ip_hdr(*pskb)->daddr) {
dst_release((*pskb)->dst); dst_release((*pskb)->dst);
(*pskb)->dst = NULL; (*pskb)->dst = NULL;
} }

View File

@ -231,7 +231,7 @@ ipt_do_table(struct sk_buff **pskb,
struct xt_table_info *private; struct xt_table_info *private;
/* Initialization */ /* Initialization */
ip = (*pskb)->nh.iph; ip = ip_hdr(*pskb);
datalen = (*pskb)->len - ip->ihl * 4; datalen = (*pskb)->len - ip->ihl * 4;
indev = in ? in->name : nulldevname; indev = in ? in->name : nulldevname;
outdev = out ? out->name : nulldevname; outdev = out ? out->name : nulldevname;
@ -320,7 +320,7 @@ ipt_do_table(struct sk_buff **pskb,
= 0x57acc001; = 0x57acc001;
#endif #endif
/* Target might have changed stuff. */ /* Target might have changed stuff. */
ip = (*pskb)->nh.iph; ip = ip_hdr(*pskb);
datalen = (*pskb)->len - ip->ihl * 4; datalen = (*pskb)->len - ip->ihl * 4;
if (verdict == IPT_CONTINUE) if (verdict == IPT_CONTINUE)

View File

@ -240,7 +240,7 @@ clusterip_del_node(struct clusterip_config *c, u_int16_t nodenum)
static inline u_int32_t static inline u_int32_t
clusterip_hashfn(struct sk_buff *skb, struct clusterip_config *config) clusterip_hashfn(struct sk_buff *skb, struct clusterip_config *config)
{ {
struct iphdr *iph = skb->nh.iph; struct iphdr *iph = ip_hdr(skb);
unsigned long hashval; unsigned long hashval;
u_int16_t sport, dport; u_int16_t sport, dport;
u_int16_t *ports; u_int16_t *ports;
@ -328,7 +328,7 @@ target(struct sk_buff **pskb,
/* special case: ICMP error handling. conntrack distinguishes between /* special case: ICMP error handling. conntrack distinguishes between
* error messages (RELATED) and information requests (see below) */ * error messages (RELATED) and information requests (see below) */
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP
&& (ctinfo == IP_CT_RELATED && (ctinfo == IP_CT_RELATED
|| ctinfo == IP_CT_RELATED+IP_CT_IS_REPLY)) || ctinfo == IP_CT_RELATED+IP_CT_IS_REPLY))
return XT_CONTINUE; return XT_CONTINUE;

View File

@ -30,13 +30,13 @@ MODULE_DESCRIPTION("iptables ECN modification module");
static inline int static inline int
set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo) set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo)
{ {
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) { if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) {
__u8 oldtos; __u8 oldtos;
if (!skb_make_writable(pskb, sizeof(struct iphdr))) if (!skb_make_writable(pskb, sizeof(struct iphdr)))
return 0; return 0;
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
oldtos = iph->tos; oldtos = iph->tos;
iph->tos &= ~IPT_ECN_IP_MASK; iph->tos &= ~IPT_ECN_IP_MASK;
iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK); iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK);
@ -66,7 +66,7 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo)
if (!skb_make_writable(pskb, ip_hdrlen(*pskb) + sizeof(*tcph))) if (!skb_make_writable(pskb, ip_hdrlen(*pskb) + sizeof(*tcph)))
return 0; return 0;
tcph = (void *)(*pskb)->nh.iph + ip_hdrlen(*pskb); tcph = (void *)ip_hdr(*pskb) + ip_hdrlen(*pskb);
oldval = ((__be16 *)tcph)[6]; oldval = ((__be16 *)tcph)[6];
if (einfo->operation & IPT_ECN_OP_SET_ECE) if (einfo->operation & IPT_ECN_OP_SET_ECE)
@ -94,7 +94,7 @@ target(struct sk_buff **pskb,
return NF_DROP; return NF_DROP;
if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR)
&& (*pskb)->nh.iph->protocol == IPPROTO_TCP) && ip_hdr(*pskb)->protocol == IPPROTO_TCP)
if (!set_ect_tcp(pskb, einfo)) if (!set_ect_tcp(pskb, einfo))
return NF_DROP; return NF_DROP;

View File

@ -75,9 +75,9 @@ target(struct sk_buff **pskb,
netmask = ~(mr->range[0].min_ip ^ mr->range[0].max_ip); netmask = ~(mr->range[0].min_ip ^ mr->range[0].max_ip);
if (hooknum == NF_IP_PRE_ROUTING || hooknum == NF_IP_LOCAL_OUT) if (hooknum == NF_IP_PRE_ROUTING || hooknum == NF_IP_LOCAL_OUT)
new_ip = (*pskb)->nh.iph->daddr & ~netmask; new_ip = ip_hdr(*pskb)->daddr & ~netmask;
else else
new_ip = (*pskb)->nh.iph->saddr & ~netmask; new_ip = ip_hdr(*pskb)->saddr & ~netmask;
new_ip |= mr->range[0].min_ip & netmask; new_ip |= mr->range[0].min_ip & netmask;
newrange = ((struct ip_nat_range) newrange = ((struct ip_nat_range)

View File

@ -43,6 +43,7 @@ MODULE_DESCRIPTION("iptables REJECT target module");
static void send_reset(struct sk_buff *oldskb, int hook) static void send_reset(struct sk_buff *oldskb, int hook)
{ {
struct sk_buff *nskb; struct sk_buff *nskb;
struct iphdr *niph;
struct tcphdr _otcph, *oth, *tcph; struct tcphdr _otcph, *oth, *tcph;
__be16 tmp_port; __be16 tmp_port;
__be32 tmp_addr; __be32 tmp_addr;
@ -50,7 +51,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
unsigned int addr_type; unsigned int addr_type;
/* IP header checks: fragment. */ /* IP header checks: fragment. */
if (oldskb->nh.iph->frag_off & htons(IP_OFFSET)) if (ip_hdr(oldskb)->frag_off & htons(IP_OFFSET))
return; return;
oth = skb_header_pointer(oldskb, ip_hdrlen(oldskb), oth = skb_header_pointer(oldskb, ip_hdrlen(oldskb),
@ -86,9 +87,10 @@ static void send_reset(struct sk_buff *oldskb, int hook)
tcph = (struct tcphdr *)(skb_network_header(nskb) + ip_hdrlen(nskb)); tcph = (struct tcphdr *)(skb_network_header(nskb) + ip_hdrlen(nskb));
/* Swap source and dest */ /* Swap source and dest */
tmp_addr = nskb->nh.iph->saddr; niph = ip_hdr(nskb);
nskb->nh.iph->saddr = nskb->nh.iph->daddr; tmp_addr = niph->saddr;
nskb->nh.iph->daddr = tmp_addr; niph->saddr = niph->daddr;
niph->daddr = tmp_addr;
tmp_port = tcph->source; tmp_port = tcph->source;
tcph->source = tcph->dest; tcph->source = tcph->dest;
tcph->dest = tmp_port; tcph->dest = tmp_port;
@ -96,7 +98,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
/* Truncate to length (no data) */ /* Truncate to length (no data) */
tcph->doff = sizeof(struct tcphdr)/4; tcph->doff = sizeof(struct tcphdr)/4;
skb_trim(nskb, ip_hdrlen(nskb) + sizeof(struct tcphdr)); skb_trim(nskb, ip_hdrlen(nskb) + sizeof(struct tcphdr));
nskb->nh.iph->tot_len = htons(nskb->len); niph->tot_len = htons(nskb->len);
if (tcph->ack) { if (tcph->ack) {
needs_ack = 0; needs_ack = 0;
@ -121,14 +123,13 @@ static void send_reset(struct sk_buff *oldskb, int hook)
/* Adjust TCP checksum */ /* Adjust TCP checksum */
tcph->check = 0; tcph->check = 0;
tcph->check = tcp_v4_check(sizeof(struct tcphdr), tcph->check = tcp_v4_check(sizeof(struct tcphdr),
nskb->nh.iph->saddr, niph->saddr, niph->daddr,
nskb->nh.iph->daddr,
csum_partial((char *)tcph, csum_partial((char *)tcph,
sizeof(struct tcphdr), 0)); sizeof(struct tcphdr), 0));
/* Set DF, id = 0 */ /* Set DF, id = 0 */
nskb->nh.iph->frag_off = htons(IP_DF); niph->frag_off = htons(IP_DF);
nskb->nh.iph->id = 0; niph->id = 0;
addr_type = RTN_UNSPEC; addr_type = RTN_UNSPEC;
if (hook != NF_IP_FORWARD if (hook != NF_IP_FORWARD
@ -144,12 +145,11 @@ static void send_reset(struct sk_buff *oldskb, int hook)
nskb->ip_summed = CHECKSUM_NONE; nskb->ip_summed = CHECKSUM_NONE;
/* Adjust IP TTL */ /* Adjust IP TTL */
nskb->nh.iph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); niph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT);
/* Adjust IP checksum */ /* Adjust IP checksum */
nskb->nh.iph->check = 0; niph->check = 0;
nskb->nh.iph->check = ip_fast_csum(skb_network_header(nskb), niph->check = ip_fast_csum(skb_network_header(nskb), niph->ihl);
nskb->nh.iph->ihl);
/* "Never happens" */ /* "Never happens" */
if (nskb->len > dst_mtu(nskb->dst)) if (nskb->len > dst_mtu(nskb->dst))

View File

@ -29,13 +29,13 @@ target(struct sk_buff **pskb,
const void *targinfo) const void *targinfo)
{ {
const struct ipt_tos_target_info *tosinfo = targinfo; const struct ipt_tos_target_info *tosinfo = targinfo;
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
if ((iph->tos & IPTOS_TOS_MASK) != tosinfo->tos) { if ((iph->tos & IPTOS_TOS_MASK) != tosinfo->tos) {
__u8 oldtos; __u8 oldtos;
if (!skb_make_writable(pskb, sizeof(struct iphdr))) if (!skb_make_writable(pskb, sizeof(struct iphdr)))
return NF_DROP; return NF_DROP;
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
oldtos = iph->tos; oldtos = iph->tos;
iph->tos = (iph->tos & IPTOS_PREC_MASK) | tosinfo->tos; iph->tos = (iph->tos & IPTOS_PREC_MASK) | tosinfo->tos;
nf_csum_replace2(&iph->check, htons(oldtos), htons(iph->tos)); nf_csum_replace2(&iph->check, htons(oldtos), htons(iph->tos));

View File

@ -32,7 +32,7 @@ ipt_ttl_target(struct sk_buff **pskb,
if (!skb_make_writable(pskb, (*pskb)->len)) if (!skb_make_writable(pskb, (*pskb)->len))
return NF_DROP; return NF_DROP;
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
switch (info->mode) { switch (info->mode) {
case IPT_TTL_SET: case IPT_TTL_SET:

View File

@ -33,7 +33,7 @@ static int match(const struct sk_buff *skb,
int offset, unsigned int protoff, int *hotdrop) int offset, unsigned int protoff, int *hotdrop)
{ {
const struct ipt_addrtype_info *info = matchinfo; const struct ipt_addrtype_info *info = matchinfo;
const struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
int ret = 1; int ret = 1;
if (info->source) if (info->source)

View File

@ -27,7 +27,7 @@ MODULE_LICENSE("GPL");
static inline int match_ip(const struct sk_buff *skb, static inline int match_ip(const struct sk_buff *skb,
const struct ipt_ecn_info *einfo) const struct ipt_ecn_info *einfo)
{ {
return ((skb->nh.iph->tos&IPT_ECN_IP_MASK) == einfo->ip_ect); return (ip_hdr(skb)->tos & IPT_ECN_IP_MASK) == einfo->ip_ect;
} }
static inline int match_tcp(const struct sk_buff *skb, static inline int match_tcp(const struct sk_buff *skb,
@ -80,7 +80,7 @@ static int match(const struct sk_buff *skb,
return 0; return 0;
if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) { if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) {
if (skb->nh.iph->protocol != IPPROTO_TCP) if (ip_hdr(skb)->protocol != IPPROTO_TCP)
return 0; return 0;
if (!match_tcp(skb, info, hotdrop)) if (!match_tcp(skb, info, hotdrop))
return 0; return 0;

View File

@ -32,7 +32,7 @@ match(const struct sk_buff *skb,
int offset, unsigned int protoff, int *hotdrop) int offset, unsigned int protoff, int *hotdrop)
{ {
const struct ipt_iprange_info *info = matchinfo; const struct ipt_iprange_info *info = matchinfo;
const struct iphdr *iph = skb->nh.iph; const struct iphdr *iph = ip_hdr(skb);
if (info->flags & IPRANGE_SRC) { if (info->flags & IPRANGE_SRC) {
if (((ntohl(iph->saddr) < ntohl(info->src.min_ip)) if (((ntohl(iph->saddr) < ntohl(info->src.min_ip))

View File

@ -183,11 +183,11 @@ ipt_recent_match(const struct sk_buff *skb,
int ret = info->invert; int ret = info->invert;
if (info->side == IPT_RECENT_DEST) if (info->side == IPT_RECENT_DEST)
addr = skb->nh.iph->daddr; addr = ip_hdr(skb)->daddr;
else else
addr = skb->nh.iph->saddr; addr = ip_hdr(skb)->saddr;
ttl = skb->nh.iph->ttl; ttl = ip_hdr(skb)->ttl;
/* use TTL as seen before forwarding */ /* use TTL as seen before forwarding */
if (out && !skb->sk) if (out && !skb->sk)
ttl++; ttl++;

View File

@ -30,7 +30,7 @@ match(const struct sk_buff *skb,
{ {
const struct ipt_tos_info *info = matchinfo; const struct ipt_tos_info *info = matchinfo;
return (skb->nh.iph->tos == info->tos) ^ info->invert; return (ip_hdr(skb)->tos == info->tos) ^ info->invert;
} }
static struct xt_match tos_match = { static struct xt_match tos_match = {

View File

@ -26,19 +26,20 @@ static int match(const struct sk_buff *skb,
int offset, unsigned int protoff, int *hotdrop) int offset, unsigned int protoff, int *hotdrop)
{ {
const struct ipt_ttl_info *info = matchinfo; const struct ipt_ttl_info *info = matchinfo;
const u8 ttl = ip_hdr(skb)->ttl;
switch (info->mode) { switch (info->mode) {
case IPT_TTL_EQ: case IPT_TTL_EQ:
return (skb->nh.iph->ttl == info->ttl); return (ttl == info->ttl);
break; break;
case IPT_TTL_NE: case IPT_TTL_NE:
return (!(skb->nh.iph->ttl == info->ttl)); return (!(ttl == info->ttl));
break; break;
case IPT_TTL_LT: case IPT_TTL_LT:
return (skb->nh.iph->ttl < info->ttl); return (ttl < info->ttl);
break; break;
case IPT_TTL_GT: case IPT_TTL_GT:
return (skb->nh.iph->ttl > info->ttl); return (ttl > info->ttl);
break; break;
default: default:
printk(KERN_WARNING "ipt_ttl: unknown mode %d\n", printk(KERN_WARNING "ipt_ttl: unknown mode %d\n",

View File

@ -131,6 +131,7 @@ ipt_local_hook(unsigned int hook,
int (*okfn)(struct sk_buff *)) int (*okfn)(struct sk_buff *))
{ {
unsigned int ret; unsigned int ret;
const struct iphdr *iph;
u_int8_t tos; u_int8_t tos;
__be32 saddr, daddr; __be32 saddr, daddr;
u_int32_t mark; u_int32_t mark;
@ -145,19 +146,23 @@ ipt_local_hook(unsigned int hook,
/* Save things which could affect route */ /* Save things which could affect route */
mark = (*pskb)->mark; mark = (*pskb)->mark;
saddr = (*pskb)->nh.iph->saddr; iph = ip_hdr(*pskb);
daddr = (*pskb)->nh.iph->daddr; saddr = iph->saddr;
tos = (*pskb)->nh.iph->tos; daddr = iph->daddr;
tos = iph->tos;
ret = ipt_do_table(pskb, hook, in, out, &packet_mangler); ret = ipt_do_table(pskb, hook, in, out, &packet_mangler);
/* Reroute for ANY change. */ /* Reroute for ANY change. */
if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE) {
&& ((*pskb)->nh.iph->saddr != saddr iph = ip_hdr(*pskb);
|| (*pskb)->nh.iph->daddr != daddr
|| (*pskb)->mark != mark if (iph->saddr != saddr ||
|| (*pskb)->nh.iph->tos != tos)) iph->daddr != daddr ||
if (ip_route_me_harder(pskb, RTN_UNSPEC)) (*pskb)->mark != mark ||
ret = NF_DROP; iph->tos != tos)
if (ip_route_me_harder(pskb, RTN_UNSPEC))
ret = NF_DROP;
}
return ret; return ret;
} }

View File

@ -87,7 +87,7 @@ nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
local_bh_enable(); local_bh_enable();
if (skb) if (skb)
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
return skb; return skb;
} }
@ -97,16 +97,16 @@ ipv4_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff,
u_int8_t *protonum) u_int8_t *protonum)
{ {
/* Never happen */ /* Never happen */
if ((*pskb)->nh.iph->frag_off & htons(IP_OFFSET)) { if (ip_hdr(*pskb)->frag_off & htons(IP_OFFSET)) {
if (net_ratelimit()) { if (net_ratelimit()) {
printk(KERN_ERR "ipv4_prepare: Frag of proto %u (hook=%u)\n", printk(KERN_ERR "ipv4_prepare: Frag of proto %u (hook=%u)\n",
(*pskb)->nh.iph->protocol, hooknum); ip_hdr(*pskb)->protocol, hooknum);
} }
return -NF_DROP; return -NF_DROP;
} }
*dataoff = skb_network_offset(*pskb) + ip_hdrlen(*pskb); *dataoff = skb_network_offset(*pskb) + ip_hdrlen(*pskb);
*protonum = (*pskb)->nh.iph->protocol; *protonum = ip_hdr(*pskb)->protocol;
return NF_ACCEPT; return NF_ACCEPT;
} }
@ -170,7 +170,7 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
#endif #endif
/* Gather fragments. */ /* Gather fragments. */
if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) {
*pskb = nf_ct_ipv4_gather_frags(*pskb, *pskb = nf_ct_ipv4_gather_frags(*pskb,
hooknum == NF_IP_PRE_ROUTING ? hooknum == NF_IP_PRE_ROUTING ?
IP_DEFRAG_CONNTRACK_IN : IP_DEFRAG_CONNTRACK_IN :

View File

@ -44,7 +44,7 @@ static int set_addr(struct sk_buff **pskb,
buf.port = port; buf.port = port;
addroff += dataoff; addroff += dataoff;
if ((*pskb)->nh.iph->protocol == IPPROTO_TCP) { if (ip_hdr(*pskb)->protocol == IPPROTO_TCP) {
if (!nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, if (!nf_nat_mangle_tcp_packet(pskb, ct, ctinfo,
addroff, sizeof(buf), addroff, sizeof(buf),
(char *) &buf, sizeof(buf))) { (char *) &buf, sizeof(buf))) {

View File

@ -87,7 +87,7 @@ static void mangle_contents(struct sk_buff *skb,
unsigned char *data; unsigned char *data;
BUG_ON(skb_is_nonlinear(skb)); BUG_ON(skb_is_nonlinear(skb));
data = (unsigned char *)skb->nh.iph + dataoff; data = skb_network_header(skb) + dataoff;
/* move post-replacement */ /* move post-replacement */
memmove(data + match_offset + rep_len, memmove(data + match_offset + rep_len,
@ -111,8 +111,8 @@ static void mangle_contents(struct sk_buff *skb,
} }
/* fix IP hdr checksum information */ /* fix IP hdr checksum information */
skb->nh.iph->tot_len = htons(skb->len); ip_hdr(skb)->tot_len = htons(skb->len);
ip_send_check(skb->nh.iph); ip_send_check(ip_hdr(skb));
} }
/* Unusual, but possible case. */ /* Unusual, but possible case. */
@ -166,7 +166,7 @@ nf_nat_mangle_tcp_packet(struct sk_buff **pskb,
SKB_LINEAR_ASSERT(*pskb); SKB_LINEAR_ASSERT(*pskb);
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
tcph = (void *)iph + iph->ihl*4; tcph = (void *)iph + iph->ihl*4;
oldlen = (*pskb)->len - iph->ihl*4; oldlen = (*pskb)->len - iph->ihl*4;
@ -221,7 +221,7 @@ nf_nat_mangle_udp_packet(struct sk_buff **pskb,
int datalen, oldlen; int datalen, oldlen;
/* UDP helpers might accidentally mangle the wrong packet */ /* UDP helpers might accidentally mangle the wrong packet */
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) + if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) +
match_offset + match_len) match_offset + match_len)
return 0; return 0;
@ -234,7 +234,7 @@ nf_nat_mangle_udp_packet(struct sk_buff **pskb,
!enlarge_skb(pskb, rep_len - match_len)) !enlarge_skb(pskb, rep_len - match_len))
return 0; return 0;
iph = (*pskb)->nh.iph; iph = ip_hdr(*pskb);
udph = (void *)iph + iph->ihl*4; udph = (void *)iph + iph->ihl*4;
oldlen = (*pskb)->len - iph->ihl*4; oldlen = (*pskb)->len - iph->ihl*4;

View File

@ -191,7 +191,7 @@ static unsigned int ipt_dnat_target(struct sk_buff **pskb,
if (hooknum == NF_IP_LOCAL_OUT && if (hooknum == NF_IP_LOCAL_OUT &&
mr->range[0].flags & IP_NAT_RANGE_MAP_IPS) mr->range[0].flags & IP_NAT_RANGE_MAP_IPS)
warn_if_extra_mangle((*pskb)->nh.iph->daddr, warn_if_extra_mangle(ip_hdr(*pskb)->daddr,
mr->range[0].min_ip); mr->range[0].min_ip);
return nf_nat_setup_info(ct, &mr->range[0], hooknum); return nf_nat_setup_info(ct, &mr->range[0], hooknum);

View File

@ -1194,7 +1194,7 @@ static int snmp_translate(struct nf_conn *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
struct sk_buff **pskb) struct sk_buff **pskb)
{ {
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl); struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
u_int16_t udplen = ntohs(udph->len); u_int16_t udplen = ntohs(udph->len);
u_int16_t paylen = udplen - sizeof(struct udphdr); u_int16_t paylen = udplen - sizeof(struct udphdr);
@ -1235,7 +1235,7 @@ static int help(struct sk_buff **pskb, unsigned int protoff,
{ {
int dir = CTINFO2DIR(ctinfo); int dir = CTINFO2DIR(ctinfo);
unsigned int ret; unsigned int ret;
struct iphdr *iph = (*pskb)->nh.iph; struct iphdr *iph = ip_hdr(*pskb);
struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl); struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl);
/* SNMP replies and originating SNMP traps get mangled */ /* SNMP replies and originating SNMP traps get mangled */

View File

@ -86,8 +86,7 @@ nf_nat_fn(unsigned int hooknum,
/* We never see fragments: conntrack defrags on pre-routing /* We never see fragments: conntrack defrags on pre-routing
and local-out, and nf_nat_out protects post-routing. */ and local-out, and nf_nat_out protects post-routing. */
NF_CT_ASSERT(!((*pskb)->nh.iph->frag_off NF_CT_ASSERT(!(ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)));
& htons(IP_MF|IP_OFFSET)));
ct = nf_ct_get(*pskb, &ctinfo); ct = nf_ct_get(*pskb, &ctinfo);
/* Can't track? It's not due to stress, or conntrack would /* Can't track? It's not due to stress, or conntrack would
@ -98,7 +97,7 @@ nf_nat_fn(unsigned int hooknum,
/* Exception: ICMP redirect to new connection (not in /* Exception: ICMP redirect to new connection (not in
hash table yet). We must not let this through, in hash table yet). We must not let this through, in
case we're doing NAT to the same network. */ case we're doing NAT to the same network. */
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP) {
struct icmphdr _hdr, *hp; struct icmphdr _hdr, *hp;
hp = skb_header_pointer(*pskb, ip_hdrlen(*pskb), hp = skb_header_pointer(*pskb, ip_hdrlen(*pskb),
@ -121,7 +120,7 @@ nf_nat_fn(unsigned int hooknum,
switch (ctinfo) { switch (ctinfo) {
case IP_CT_RELATED: case IP_CT_RELATED:
case IP_CT_RELATED+IP_CT_IS_REPLY: case IP_CT_RELATED+IP_CT_IS_REPLY:
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP) {
if (!nf_nat_icmp_reply_translation(ct, ctinfo, if (!nf_nat_icmp_reply_translation(ct, ctinfo,
hooknum, pskb)) hooknum, pskb))
return NF_DROP; return NF_DROP;
@ -176,11 +175,11 @@ nf_nat_in(unsigned int hooknum,
int (*okfn)(struct sk_buff *)) int (*okfn)(struct sk_buff *))
{ {
unsigned int ret; unsigned int ret;
__be32 daddr = (*pskb)->nh.iph->daddr; __be32 daddr = ip_hdr(*pskb)->daddr;
ret = nf_nat_fn(hooknum, pskb, in, out, okfn); ret = nf_nat_fn(hooknum, pskb, in, out, okfn);
if (ret != NF_DROP && ret != NF_STOLEN && if (ret != NF_DROP && ret != NF_STOLEN &&
daddr != (*pskb)->nh.iph->daddr) { daddr != ip_hdr(*pskb)->daddr) {
dst_release((*pskb)->dst); dst_release((*pskb)->dst);
(*pskb)->dst = NULL; (*pskb)->dst = NULL;
} }

View File

@ -292,7 +292,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
skb->dst = dst_clone(&rt->u.dst); skb->dst = dst_clone(&rt->u.dst);
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = skb->nh.iph; iph = ip_hdr(skb);
skb_put(skb, length); skb_put(skb, length);
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
@ -615,7 +615,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
/* Copy the address. */ /* Copy the address. */
if (sin) { if (sin) {
sin->sin_family = AF_INET; sin->sin_family = AF_INET;
sin->sin_addr.s_addr = skb->nh.iph->saddr; sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
sin->sin_port = 0; sin->sin_port = 0;
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
} }

View File

@ -1519,7 +1519,7 @@ static void ipv4_link_failure(struct sk_buff *skb)
static int ip_rt_bug(struct sk_buff *skb) static int ip_rt_bug(struct sk_buff *skb)
{ {
printk(KERN_DEBUG "ip_rt_bug: %u.%u.%u.%u -> %u.%u.%u.%u, %s\n", printk(KERN_DEBUG "ip_rt_bug: %u.%u.%u.%u -> %u.%u.%u.%u, %s\n",
NIPQUAD(skb->nh.iph->saddr), NIPQUAD(skb->nh.iph->daddr), NIPQUAD(ip_hdr(skb)->saddr), NIPQUAD(ip_hdr(skb)->daddr),
skb->dev ? skb->dev->name : "?"); skb->dev ? skb->dev->name : "?");
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
@ -2134,7 +2134,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
rcu_read_lock(); rcu_read_lock();
if ((in_dev = __in_dev_get_rcu(dev)) != NULL) { if ((in_dev = __in_dev_get_rcu(dev)) != NULL) {
int our = ip_check_mc(in_dev, daddr, saddr, int our = ip_check_mc(in_dev, daddr, saddr,
skb->nh.iph->protocol); ip_hdr(skb)->protocol);
if (our if (our
#ifdef CONFIG_IP_MROUTE #ifdef CONFIG_IP_MROUTE
|| (!LOCAL_MCAST(daddr) && IN_DEV_MFORWARD(in_dev)) || (!LOCAL_MCAST(daddr) && IN_DEV_MFORWARD(in_dev))
@ -2751,7 +2751,7 @@ int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
skb_reset_network_header(skb); skb_reset_network_header(skb);
/* Bugfix: need to give ip_route_input enough of an IP header to not gag. */ /* Bugfix: need to give ip_route_input enough of an IP header to not gag. */
skb->nh.iph->protocol = IPPROTO_ICMP; ip_hdr(skb)->protocol = IPPROTO_ICMP;
skb_reserve(skb, MAX_HEADER + sizeof(struct iphdr)); skb_reserve(skb, MAX_HEADER + sizeof(struct iphdr));
src = tb[RTA_SRC] ? nla_get_be32(tb[RTA_SRC]) : 0; src = tb[RTA_SRC] ? nla_get_be32(tb[RTA_SRC]) : 0;

Some files were not shown because too many files have changed in this diff Show More