[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:

committed by
David S. Miller

parent
e023dd6437
commit
eddc9ec53b
@@ -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,
|
||||
char *o_buf, int o_len, char *n_buf, int n_len)
|
||||
{
|
||||
struct iphdr *iph;
|
||||
int diff;
|
||||
int o_offset;
|
||||
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 */
|
||||
iph = skb->nh.iph;
|
||||
iph->tot_len = htons(skb->len);
|
||||
ip_hdr(skb)->tot_len = htons(skb->len);
|
||||
|
||||
LeaveFunction(9);
|
||||
return 0;
|
||||
|
@@ -212,7 +212,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
__be16 ports[2])
|
||||
{
|
||||
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_conn *ct;
|
||||
__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)
|
||||
{
|
||||
struct ip_vs_conn *cp = NULL;
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
struct ip_vs_dest *dest;
|
||||
__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)
|
||||
{
|
||||
__be16 _ports[2], *pptr;
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
pptr = skb_header_pointer(skb, iph->ihl*4,
|
||||
sizeof(_ports), _ports);
|
||||
@@ -546,7 +546,7 @@ ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user)
|
||||
{
|
||||
skb = ip_defrag(skb, user);
|
||||
if (skb)
|
||||
ip_send_check(skb->nh.iph);
|
||||
ip_send_check(ip_hdr(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,
|
||||
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;
|
||||
struct icmphdr *icmph = (struct icmphdr *)(skb_network_header(skb) +
|
||||
icmp_offset);
|
||||
@@ -618,14 +618,14 @@ static int ip_vs_out_icmp(struct sk_buff **pskb, int *related)
|
||||
*related = 1;
|
||||
|
||||
/* 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);
|
||||
if (!skb)
|
||||
return NF_STOLEN;
|
||||
*pskb = skb;
|
||||
}
|
||||
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
offset = ihl = iph->ihl * 4;
|
||||
ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
|
||||
if (ic == NULL)
|
||||
@@ -740,14 +740,14 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
|
||||
if (skb->ipvs_property)
|
||||
return NF_ACCEPT;
|
||||
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
if (unlikely(iph->protocol == IPPROTO_ICMP)) {
|
||||
int related, verdict = ip_vs_out_icmp(pskb, &related);
|
||||
|
||||
if (related)
|
||||
return verdict;
|
||||
skb = *pskb;
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
}
|
||||
|
||||
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);
|
||||
if (!skb)
|
||||
return NF_STOLEN;
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(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))
|
||||
goto drop;
|
||||
skb = *pskb;
|
||||
skb->nh.iph->saddr = cp->vaddr;
|
||||
ip_send_check(skb->nh.iph);
|
||||
ip_hdr(skb)->saddr = cp->vaddr;
|
||||
ip_send_check(ip_hdr(skb));
|
||||
|
||||
/* For policy routing, packets originating from this
|
||||
* 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;
|
||||
|
||||
/* 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,
|
||||
hooknum == NF_IP_LOCAL_IN ?
|
||||
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;
|
||||
}
|
||||
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
offset = ihl = iph->ihl * 4;
|
||||
ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
|
||||
if (ic == NULL)
|
||||
@@ -966,19 +966,19 @@ ip_vs_in(unsigned int hooknum, struct sk_buff **pskb,
|
||||
|| skb->dev == &loopback_dev || skb->sk)) {
|
||||
IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n",
|
||||
skb->pkt_type,
|
||||
skb->nh.iph->protocol,
|
||||
NIPQUAD(skb->nh.iph->daddr));
|
||||
ip_hdr(skb)->protocol,
|
||||
NIPQUAD(ip_hdr(skb)->daddr));
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
if (unlikely(iph->protocol == IPPROTO_ICMP)) {
|
||||
int related, verdict = ip_vs_in_icmp(pskb, &related, hooknum);
|
||||
|
||||
if (related)
|
||||
return verdict;
|
||||
skb = *pskb;
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
}
|
||||
|
||||
/* Protocol supported? */
|
||||
@@ -1064,7 +1064,7 @@ ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff **pskb,
|
||||
{
|
||||
int r;
|
||||
|
||||
if ((*pskb)->nh.iph->protocol != IPPROTO_ICMP)
|
||||
if (ip_hdr(*pskb)->protocol != IPPROTO_ICMP)
|
||||
return NF_ACCEPT;
|
||||
|
||||
return ip_vs_in_icmp(pskb, &r, hooknum);
|
||||
|
@@ -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_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");
|
||||
|
||||
|
@@ -159,7 +159,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
|
||||
return 0;
|
||||
|
||||
if (cp->app_data == &ip_vs_ftp_pasv) {
|
||||
iph = (*pskb)->nh.iph;
|
||||
iph = ip_hdr(*pskb);
|
||||
th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]);
|
||||
data = (char *)th + (th->doff << 2);
|
||||
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
|
||||
*/
|
||||
iph = (*pskb)->nh.iph;
|
||||
iph = ip_hdr(*pskb);
|
||||
th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]);
|
||||
|
||||
/* Since there may be OPTIONS in the TCP packet and the HLEN is
|
||||
|
@@ -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_lblc_table *tbl;
|
||||
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");
|
||||
|
||||
|
@@ -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_lblcr_table *tbl;
|
||||
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");
|
||||
|
||||
|
@@ -83,8 +83,8 @@ tcp_conn_schedule(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
if (th->syn &&
|
||||
(svc = ip_vs_service_get(skb->mark, skb->nh.iph->protocol,
|
||||
skb->nh.iph->daddr, th->dest))) {
|
||||
(svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
|
||||
ip_hdr(skb)->daddr, th->dest))) {
|
||||
if (ip_vs_todrop()) {
|
||||
/*
|
||||
* It seems that we are very loaded.
|
||||
@@ -142,7 +142,7 @@ tcp_snat_handler(struct sk_buff **pskb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
tcph = (void *)(*pskb)->nh.iph + tcphoff;
|
||||
tcph = (void *)ip_hdr(*pskb) + tcphoff;
|
||||
tcph->source = cp->vport;
|
||||
|
||||
/* Adjust TCP checksums */
|
||||
@@ -193,7 +193,7 @@ tcp_dnat_handler(struct sk_buff **pskb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
tcph = (void *)(*pskb)->nh.iph + tcphoff;
|
||||
tcph = (void *)ip_hdr(*pskb) + tcphoff;
|
||||
tcph->dest = cp->dport;
|
||||
|
||||
/*
|
||||
@@ -229,9 +229,9 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
|
||||
case CHECKSUM_NONE:
|
||||
skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0);
|
||||
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->nh.iph->protocol, skb->csum)) {
|
||||
ip_hdr(skb)->protocol, skb->csum)) {
|
||||
IP_VS_DBG_RL_PKT(0, pp, skb, 0,
|
||||
"Failed checksum for");
|
||||
return 0;
|
||||
|
@@ -89,8 +89,8 @@ udp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((svc = ip_vs_service_get(skb->mark, skb->nh.iph->protocol,
|
||||
skb->nh.iph->daddr, uh->dest))) {
|
||||
if ((svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
|
||||
ip_hdr(skb)->daddr, uh->dest))) {
|
||||
if (ip_vs_todrop()) {
|
||||
/*
|
||||
* It seems that we are very loaded.
|
||||
@@ -151,7 +151,7 @@ udp_snat_handler(struct sk_buff **pskb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
udph = (void *)(*pskb)->nh.iph + udphoff;
|
||||
udph = (void *)ip_hdr(*pskb) + udphoff;
|
||||
udph->source = cp->vport;
|
||||
|
||||
/*
|
||||
@@ -206,7 +206,7 @@ udp_dnat_handler(struct sk_buff **pskb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
udph = (void *)(*pskb)->nh.iph + udphoff;
|
||||
udph = (void *)ip_hdr(*pskb) + udphoff;
|
||||
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->len - udphoff, 0);
|
||||
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 - udphoff,
|
||||
skb->nh.iph->protocol,
|
||||
ip_hdr(skb)->protocol,
|
||||
skb->csum)) {
|
||||
IP_VS_DBG_RL_PKT(0, pp, skb, 0,
|
||||
"Failed checksum for");
|
||||
|
@@ -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_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");
|
||||
|
||||
|
@@ -156,7 +156,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
struct ip_vs_protocol *pp)
|
||||
{
|
||||
struct rtable *rt; /* Route to the other host */
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
u8 tos = iph->tos;
|
||||
int mtu;
|
||||
struct flowi fl = {
|
||||
@@ -193,7 +193,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
ip_rt_put(rt);
|
||||
return NF_STOLEN;
|
||||
}
|
||||
ip_send_check(skb->nh.iph);
|
||||
ip_send_check(ip_hdr(skb));
|
||||
|
||||
/* drop old route */
|
||||
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 */
|
||||
int mtu;
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
EnterFunction(10);
|
||||
|
||||
@@ -266,8 +266,8 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
/* mangle the packet */
|
||||
if (pp->dnat_handler && !pp->dnat_handler(&skb, pp, cp))
|
||||
goto tx_error;
|
||||
skb->nh.iph->daddr = cp->daddr;
|
||||
ip_send_check(skb->nh.iph);
|
||||
ip_hdr(skb)->daddr = cp->daddr;
|
||||
ip_send_check(ip_hdr(skb));
|
||||
|
||||
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 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;
|
||||
__be16 df = old_iph->frag_off;
|
||||
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);
|
||||
skb = new_skb;
|
||||
old_iph = skb->nh.iph;
|
||||
old_iph = ip_hdr(skb);
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
iph = skb->nh.iph;
|
||||
iph = ip_hdr(skb);
|
||||
iph->version = 4;
|
||||
iph->ihl = sizeof(struct iphdr)>>2;
|
||||
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 rtable *rt; /* Route to the other host */
|
||||
struct iphdr *iph = skb->nh.iph;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
int mtu;
|
||||
|
||||
EnterFunction(10);
|
||||
@@ -461,7 +461,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
ip_rt_put(rt);
|
||||
return NF_STOLEN;
|
||||
}
|
||||
ip_send_check(skb->nh.iph);
|
||||
ip_send_check(ip_hdr(skb));
|
||||
|
||||
/* drop old route */
|
||||
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)
|
||||
*/
|
||||
|
||||
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;
|
||||
|
||||
/* MTU checking */
|
||||
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);
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
||||
IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n");
|
||||
|
Reference in New Issue
Block a user