[SK_BUFF]: Introduce skb_network_header()
For the places where we need a pointer to the network header, it is still legal to touch skb->nh.raw directly if just adding to, subtracting from or setting it to another layer header. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
bbe735e424
commit
d56f90a7c9
@@ -1184,7 +1184,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
|
||||
iph->id = htons(id++);
|
||||
iph->tot_len = htons(skb->len - skb->mac_len);
|
||||
iph->check = 0;
|
||||
iph->check = ip_fast_csum(skb->nh.raw, iph->ihl);
|
||||
iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
|
||||
} while ((skb = skb->next));
|
||||
|
||||
out:
|
||||
|
||||
@@ -154,7 +154,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
ah = (struct ip_auth_hdr*)skb->data;
|
||||
iph = skb->nh.iph;
|
||||
|
||||
ihl = skb->data - skb->nh.raw;
|
||||
ihl = skb->data - skb_network_header(skb);
|
||||
memcpy(work_buf, iph, ihl);
|
||||
|
||||
iph->ttl = 0;
|
||||
@@ -181,7 +181,8 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
((struct iphdr*)work_buf)->protocol = ah->nexthdr;
|
||||
skb->h.raw = memcpy(skb->nh.raw += ah_hlen, work_buf, ihl);
|
||||
skb->nh.raw += ah_hlen;
|
||||
skb->h.raw = memcpy(skb_network_header(skb), work_buf, ihl);
|
||||
__skb_pull(skb, ah_hlen + ihl);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -57,9 +57,10 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
*(u8*)(trailer->tail + clen-skb->len - 2) = (clen - skb->len)-2;
|
||||
pskb_put(skb, trailer, clen - skb->len);
|
||||
|
||||
__skb_push(skb, skb->data - skb->nh.raw);
|
||||
__skb_push(skb, skb->data - skb_network_header(skb));
|
||||
top_iph = skb->nh.iph;
|
||||
esph = (struct ip_esp_hdr *)(skb->nh.raw + top_iph->ihl*4);
|
||||
esph = (struct ip_esp_hdr *)(skb_network_header(skb) +
|
||||
top_iph->ihl * 4);
|
||||
top_iph->tot_len = htons(skb->len + alen);
|
||||
*(u8*)(trailer->tail - 1) = top_iph->protocol;
|
||||
|
||||
@@ -222,7 +223,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
|
||||
if (x->encap) {
|
||||
struct xfrm_encap_tmpl *encap = x->encap;
|
||||
struct udphdr *uh = (void *)(skb->nh.raw + ihl);
|
||||
struct udphdr *uh = (void *)(skb_network_header(skb) + ihl);
|
||||
|
||||
/*
|
||||
* 1) if the NAT-T peer's IP or port changed then
|
||||
|
||||
@@ -484,7 +484,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
||||
u8 _inner_type, *itp;
|
||||
|
||||
itp = skb_header_pointer(skb_in,
|
||||
skb_in->nh.raw +
|
||||
skb_network_header(skb_in) +
|
||||
(iph->ihl << 2) +
|
||||
offsetof(struct icmphdr,
|
||||
type) -
|
||||
@@ -536,7 +536,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
||||
icmp_param.data.icmph.un.gateway = info;
|
||||
icmp_param.data.icmph.checksum = 0;
|
||||
icmp_param.skb = skb_in;
|
||||
icmp_param.offset = skb_in->nh.raw - skb_in->data;
|
||||
icmp_param.offset = skb_network_offset(skb_in);
|
||||
icmp_out_count(icmp_param.data.icmph.type);
|
||||
inet_sk(icmp_socket->sk)->tos = tos;
|
||||
ipc.addr = iph->saddr;
|
||||
|
||||
@@ -658,7 +658,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
|
||||
}
|
||||
|
||||
skb_shinfo(head)->frag_list = head->next;
|
||||
skb_push(head, head->data - head->nh.raw);
|
||||
skb_push(head, head->data - skb_network_header(head));
|
||||
atomic_sub(head->truesize, &ip_frag_mem);
|
||||
|
||||
for (fp=head->next; fp; fp = fp->next) {
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
void ip_options_build(struct sk_buff * skb, struct ip_options * opt,
|
||||
__be32 daddr, struct rtable *rt, int is_frag)
|
||||
{
|
||||
unsigned char * iph = skb->nh.raw;
|
||||
unsigned char *iph = skb_network_header(skb);
|
||||
|
||||
memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options));
|
||||
memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen);
|
||||
@@ -104,7 +104,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
sptr = skb->nh.raw;
|
||||
sptr = skb_network_header(skb);
|
||||
dptr = dopt->__data;
|
||||
|
||||
if (skb->dst)
|
||||
@@ -217,7 +217,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
|
||||
|
||||
void ip_options_fragment(struct sk_buff * skb)
|
||||
{
|
||||
unsigned char * optptr = skb->nh.raw + sizeof(struct iphdr);
|
||||
unsigned char *optptr = skb_network_header(skb) + sizeof(struct iphdr);
|
||||
struct ip_options * opt = &(IPCB(skb)->opt);
|
||||
int l = opt->optlen;
|
||||
int optlen;
|
||||
@@ -264,7 +264,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
|
||||
|
||||
if (!opt) {
|
||||
opt = &(IPCB(skb)->opt);
|
||||
iph = skb->nh.raw;
|
||||
iph = skb_network_header(skb);
|
||||
opt->optlen = ((struct iphdr *)iph)->ihl*4 - sizeof(struct iphdr);
|
||||
optptr = iph + sizeof(struct iphdr);
|
||||
opt->is_data = 0;
|
||||
@@ -563,7 +563,7 @@ void ip_forward_options(struct sk_buff *skb)
|
||||
struct ip_options * opt = &(IPCB(skb)->opt);
|
||||
unsigned char * optptr;
|
||||
struct rtable *rt = (struct rtable*)skb->dst;
|
||||
unsigned char *raw = skb->nh.raw;
|
||||
unsigned char *raw = skb_network_header(skb);
|
||||
|
||||
if (opt->rr_needaddr) {
|
||||
optptr = (unsigned char *)raw + opt->rr;
|
||||
@@ -609,7 +609,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
||||
int srrspace, srrptr;
|
||||
__be32 nexthop;
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
unsigned char * optptr = skb->nh.raw + opt->srr;
|
||||
unsigned char *optptr = skb_network_header(skb) + opt->srr;
|
||||
struct rtable *rt = (struct rtable*)skb->dst;
|
||||
struct rtable *rt2;
|
||||
int err;
|
||||
|
||||
@@ -503,7 +503,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
|
||||
frag->h.raw = frag->data;
|
||||
__skb_push(frag, hlen);
|
||||
skb_reset_network_header(frag);
|
||||
memcpy(frag->nh.raw, iph, hlen);
|
||||
memcpy(skb_network_header(frag), iph, hlen);
|
||||
iph = frag->nh.iph;
|
||||
iph->tot_len = htons(frag->len);
|
||||
ip_copy_metadata(frag, skb);
|
||||
@@ -607,7 +607,7 @@ slow_path:
|
||||
* Copy the packet header into the new buffer.
|
||||
*/
|
||||
|
||||
memcpy(skb2->nh.raw, skb->data, hlen);
|
||||
memcpy(skb_network_header(skb2), skb->data, hlen);
|
||||
|
||||
/*
|
||||
* Copy a block of the IP datagram.
|
||||
@@ -1198,7 +1198,7 @@ int ip_push_pending_frames(struct sock *sk)
|
||||
tail_skb = &(skb_shinfo(skb)->frag_list);
|
||||
|
||||
/* move skb->data to ip header from ext header */
|
||||
if (skb->data < skb->nh.raw)
|
||||
if (skb->data < skb_network_header(skb))
|
||||
__skb_pull(skb, skb_network_offset(skb));
|
||||
while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
|
||||
__skb_pull(tmp_skb, skb->h.raw - skb->nh.raw);
|
||||
|
||||
@@ -273,7 +273,8 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
|
||||
serr->ee.ee_pad = 0;
|
||||
serr->ee.ee_info = info;
|
||||
serr->ee.ee_data = 0;
|
||||
serr->addr_offset = (u8*)&(((struct iphdr*)(skb->h.icmph+1))->daddr) - skb->nh.raw;
|
||||
serr->addr_offset = (u8 *)&(((struct iphdr *)(skb->h.icmph + 1))->daddr) -
|
||||
skb_network_header(skb);
|
||||
serr->port = port;
|
||||
|
||||
skb->h.raw = payload;
|
||||
@@ -309,7 +310,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
|
||||
serr->ee.ee_pad = 0;
|
||||
serr->ee.ee_info = info;
|
||||
serr->ee.ee_data = 0;
|
||||
serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw;
|
||||
serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
|
||||
serr->port = port;
|
||||
|
||||
skb->h.raw = skb->tail;
|
||||
@@ -355,7 +356,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
||||
sin = (struct sockaddr_in *)msg->msg_name;
|
||||
if (sin) {
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_addr.s_addr = *(__be32*)(skb->nh.raw + serr->addr_offset);
|
||||
sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
|
||||
serr->addr_offset);
|
||||
sin->sin_port = serr->port;
|
||||
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
||||
}
|
||||
|
||||
@@ -563,7 +563,7 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
|
||||
*/
|
||||
msg = (struct igmpmsg*)skb_push(skb, sizeof(struct iphdr));
|
||||
skb->nh.raw = skb->h.raw = (u8*)msg;
|
||||
memcpy(msg, pkt->nh.raw, sizeof(struct iphdr));
|
||||
memcpy(msg, skb_network_header(pkt), sizeof(struct iphdr));
|
||||
msg->im_msgtype = IGMPMSG_WHOLEPKT;
|
||||
msg->im_mbz = 0;
|
||||
msg->im_vif = reg_vif_num;
|
||||
|
||||
@@ -338,7 +338,7 @@ static inline int app_tcp_pkt_out(struct ip_vs_conn *cp, struct sk_buff **pskb,
|
||||
if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
|
||||
return 0;
|
||||
|
||||
th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset);
|
||||
th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
|
||||
|
||||
/*
|
||||
* Remember seq number in case this pkt gets resized
|
||||
@@ -413,7 +413,7 @@ static inline int app_tcp_pkt_in(struct ip_vs_conn *cp, struct sk_buff **pskb,
|
||||
if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
|
||||
return 0;
|
||||
|
||||
th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset);
|
||||
th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
|
||||
|
||||
/*
|
||||
* Remember seq number in case this pkt gets resized
|
||||
|
||||
@@ -559,7 +559,8 @@ void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
{
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
unsigned int icmp_offset = iph->ihl*4;
|
||||
struct icmphdr *icmph = (struct icmphdr *)(skb->nh.raw + icmp_offset);
|
||||
struct icmphdr *icmph = (struct icmphdr *)(skb_network_header(skb) +
|
||||
icmp_offset);
|
||||
struct iphdr *ciph = (struct iphdr *)(icmph + 1);
|
||||
|
||||
if (inout) {
|
||||
|
||||
@@ -31,7 +31,7 @@ target(struct sk_buff **pskb,
|
||||
}
|
||||
|
||||
arp = (*pskb)->nh.arph;
|
||||
arpptr = (*pskb)->nh.raw + sizeof(*arp);
|
||||
arpptr = skb_network_header(*pskb) + sizeof(*arp);
|
||||
pln = arp->ar_pln;
|
||||
hln = arp->ar_hln;
|
||||
/* We assume that pln and hln were checked in the match */
|
||||
|
||||
@@ -105,7 +105,7 @@ ipv4_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff,
|
||||
return -NF_DROP;
|
||||
}
|
||||
|
||||
*dataoff = (*pskb)->nh.raw - (*pskb)->data + (*pskb)->nh.iph->ihl*4;
|
||||
*dataoff = skb_network_offset(*pskb) + (*pskb)->nh.iph->ihl * 4;
|
||||
*protonum = (*pskb)->nh.iph->protocol;
|
||||
|
||||
return NF_ACCEPT;
|
||||
@@ -151,10 +151,9 @@ static unsigned int ipv4_conntrack_help(unsigned int hooknum,
|
||||
if (!help || !help->helper)
|
||||
return NF_ACCEPT;
|
||||
|
||||
return help->helper->help(pskb,
|
||||
(*pskb)->nh.raw - (*pskb)->data
|
||||
+ (*pskb)->nh.iph->ihl*4,
|
||||
ct, ctinfo);
|
||||
return help->helper->help(pskb, (skb_network_offset(*pskb) +
|
||||
(*pskb)->nh.iph->ihl * 4),
|
||||
ct, ctinfo);
|
||||
}
|
||||
|
||||
static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
|
||||
|
||||
@@ -256,7 +256,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
nf_reset(skb);
|
||||
|
||||
skb_push(skb, skb->data - skb->nh.raw);
|
||||
skb_push(skb, skb->data - skb_network_header(skb));
|
||||
|
||||
raw_rcv_skb(sk, skb);
|
||||
return 0;
|
||||
|
||||
@@ -3634,7 +3634,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list,
|
||||
return;
|
||||
|
||||
skb_set_mac_header(nskb, skb_mac_header(skb) - skb->head);
|
||||
nskb->nh.raw = nskb->data + (skb->nh.raw - skb->head);
|
||||
nskb->nh.raw = nskb->data + (skb_network_header(skb) - skb->head);
|
||||
nskb->h.raw = nskb->data + (skb->h.raw - skb->head);
|
||||
|
||||
skb_reserve(nskb, header);
|
||||
|
||||
@@ -146,7 +146,7 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
|
||||
return 0;
|
||||
} else {
|
||||
#ifdef CONFIG_NETFILTER
|
||||
__skb_push(skb, skb->data - skb->nh.raw);
|
||||
__skb_push(skb, skb->data - skb_network_header(skb));
|
||||
skb->nh.iph->tot_len = htons(skb->len);
|
||||
ip_send_check(skb->nh.iph);
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
skb->nh.raw = skb->data + (phlen - sizeof(*iph));
|
||||
memmove(skb->nh.raw, iph, sizeof(*iph));
|
||||
memmove(skb_network_header(skb), iph, sizeof(*iph));
|
||||
skb->h.raw = skb->data + (phlen + optlen);
|
||||
skb->data = skb->h.raw;
|
||||
|
||||
@@ -112,7 +112,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
else
|
||||
iph->protocol = protocol;
|
||||
iph->check = 0;
|
||||
iph->check = ip_fast_csum(skb->nh.raw, iph->ihl);
|
||||
iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
|
||||
err = 0;
|
||||
out:
|
||||
return err;
|
||||
|
||||
@@ -34,7 +34,7 @@ static int xfrm4_transport_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
|
||||
skb_push(skb, x->props.header_len);
|
||||
skb_reset_network_header(skb);
|
||||
memmove(skb->nh.raw, iph, ihl);
|
||||
memmove(skb_network_header(skb), iph, ihl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
int ihl = skb->data - skb->h.raw;
|
||||
|
||||
if (skb->h.raw != skb->nh.raw) {
|
||||
memmove(skb->h.raw, skb->nh.raw, ihl);
|
||||
memmove(skb->h.raw, skb_network_header(skb), ihl);
|
||||
skb->nh.raw = skb->h.raw;
|
||||
}
|
||||
skb->nh.iph->tot_len = htons(skb->len + ihl);
|
||||
|
||||
@@ -210,7 +210,7 @@ static void
|
||||
_decode_session4(struct sk_buff *skb, struct flowi *fl)
|
||||
{
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
u8 *xprth = skb->nh.raw + iph->ihl*4;
|
||||
u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
|
||||
memset(fl, 0, sizeof(struct flowi));
|
||||
if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) {
|
||||
|
||||
Reference in New Issue
Block a user