net: skb->dst accessors
Define three accessors to get/set dst attached to a skb struct dst_entry *skb_dst(const struct sk_buff *skb) void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) void skb_dst_drop(struct sk_buff *skb) This one should replace occurrences of : dst_release(skb->dst) skb->dst = NULL; Delete skb->dst field Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
511c3f92ad
commit
adf30907d6
@@ -468,7 +468,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)
|
||||
__be32 paddr;
|
||||
struct neighbour *n;
|
||||
|
||||
if (!skb->dst) {
|
||||
if (!skb_dst(skb)) {
|
||||
printk(KERN_DEBUG "arp_find is called with dst==NULL\n");
|
||||
kfree_skb(skb);
|
||||
return 1;
|
||||
|
@@ -591,13 +591,13 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
||||
goto relookup_failed;
|
||||
|
||||
/* Ugh! */
|
||||
odst = skb_in->dst;
|
||||
odst = skb_dst(skb_in);
|
||||
err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src,
|
||||
RT_TOS(tos), rt2->u.dst.dev);
|
||||
|
||||
dst_release(&rt2->u.dst);
|
||||
rt2 = skb_rtable(skb_in);
|
||||
skb_in->dst = odst;
|
||||
skb_dst_set(skb_in, odst);
|
||||
}
|
||||
|
||||
if (err)
|
||||
@@ -659,7 +659,7 @@ static void icmp_unreach(struct sk_buff *skb)
|
||||
u32 info = 0;
|
||||
struct net *net;
|
||||
|
||||
net = dev_net(skb->dst->dev);
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
|
||||
/*
|
||||
* Incomplete header ?
|
||||
@@ -822,7 +822,7 @@ static void icmp_echo(struct sk_buff *skb)
|
||||
{
|
||||
struct net *net;
|
||||
|
||||
net = dev_net(skb->dst->dev);
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
if (!net->ipv4.sysctl_icmp_echo_ignore_all) {
|
||||
struct icmp_bxm icmp_param;
|
||||
|
||||
@@ -873,7 +873,7 @@ static void icmp_timestamp(struct sk_buff *skb)
|
||||
out:
|
||||
return;
|
||||
out_err:
|
||||
ICMP_INC_STATS_BH(dev_net(skb->dst->dev), ICMP_MIB_INERRORS);
|
||||
ICMP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), ICMP_MIB_INERRORS);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@@ -311,7 +311,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
skb->dev = dev;
|
||||
|
||||
skb_reserve(skb, LL_RESERVED_SPACE(dev));
|
||||
@@ -659,7 +659,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
|
||||
return -1;
|
||||
}
|
||||
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
|
||||
skb_reserve(skb, LL_RESERVED_SPACE(dev));
|
||||
|
||||
|
@@ -42,7 +42,7 @@ static int ip_forward_finish(struct sk_buff *skb)
|
||||
{
|
||||
struct ip_options * opt = &(IPCB(skb)->opt);
|
||||
|
||||
IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
|
||||
if (unlikely(opt->optlen))
|
||||
ip_forward_options(skb);
|
||||
@@ -123,7 +123,7 @@ sr_failed:
|
||||
|
||||
too_many_hops:
|
||||
/* Tell the sender its packet died... */
|
||||
IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_INHDRERRORS);
|
||||
IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_INHDRERRORS);
|
||||
icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0);
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
|
@@ -573,7 +573,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)
|
||||
struct ipq *qp;
|
||||
struct net *net;
|
||||
|
||||
net = skb->dev ? dev_net(skb->dev) : dev_net(skb->dst->dev);
|
||||
net = skb->dev ? dev_net(skb->dev) : dev_net(skb_dst(skb)->dev);
|
||||
IP_INC_STATS_BH(net, IPSTATS_MIB_REASMREQDS);
|
||||
|
||||
/* Start by cleaning up the memory. */
|
||||
|
@@ -643,8 +643,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += len;
|
||||
skb->dev = tunnel->dev;
|
||||
dst_release(skb->dst);
|
||||
skb->dst = NULL;
|
||||
skb_dst_drop(skb);
|
||||
nf_reset(skb);
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
@@ -698,7 +697,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if ((dst = tiph->daddr) == 0) {
|
||||
/* NBMA tunnel */
|
||||
|
||||
if (skb->dst == NULL) {
|
||||
if (skb_dst(skb) == NULL) {
|
||||
stats->tx_fifo_errors++;
|
||||
goto tx_error;
|
||||
}
|
||||
@@ -712,7 +711,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
struct in6_addr *addr6;
|
||||
int addr_type;
|
||||
struct neighbour *neigh = skb->dst->neighbour;
|
||||
struct neighbour *neigh = skb_dst(skb)->neighbour;
|
||||
|
||||
if (neigh == NULL)
|
||||
goto tx_error;
|
||||
@@ -766,10 +765,10 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if (df)
|
||||
mtu = dst_mtu(&rt->u.dst) - dev->hard_header_len - tunnel->hlen;
|
||||
else
|
||||
mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu;
|
||||
mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
|
||||
|
||||
if (skb->dst)
|
||||
skb->dst->ops->update_pmtu(skb->dst, mtu);
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
df |= (old_iph->frag_off&htons(IP_DF));
|
||||
@@ -783,14 +782,14 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
#ifdef CONFIG_IPV6
|
||||
else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
struct rt6_info *rt6 = (struct rt6_info *)skb->dst;
|
||||
struct rt6_info *rt6 = (struct rt6_info *)skb_dst(skb);
|
||||
|
||||
if (rt6 && mtu < dst_mtu(skb->dst) && mtu >= IPV6_MIN_MTU) {
|
||||
if (rt6 && mtu < dst_mtu(skb_dst(skb)) && mtu >= IPV6_MIN_MTU) {
|
||||
if ((tunnel->parms.iph.daddr &&
|
||||
!ipv4_is_multicast(tunnel->parms.iph.daddr)) ||
|
||||
rt6->rt6i_dst.plen == 128) {
|
||||
rt6->rt6i_flags |= RTF_MODIFIED;
|
||||
skb->dst->metrics[RTAX_MTU-1] = mtu;
|
||||
skb_dst(skb)->metrics[RTAX_MTU-1] = mtu;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -837,8 +836,8 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||
IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
|
||||
IPSKB_REROUTED);
|
||||
dst_release(skb->dst);
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
|
||||
/*
|
||||
* Push down and install the IPIP header.
|
||||
|
@@ -329,7 +329,7 @@ static int ip_rcv_finish(struct sk_buff *skb)
|
||||
* Initialise the virtual path cache for the packet. It describes
|
||||
* how the packet travels inside Linux networking.
|
||||
*/
|
||||
if (skb->dst == NULL) {
|
||||
if (skb_dst(skb) == NULL) {
|
||||
int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
|
||||
skb->dev);
|
||||
if (unlikely(err)) {
|
||||
@@ -344,9 +344,9 @@ static int ip_rcv_finish(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_CLS_ROUTE
|
||||
if (unlikely(skb->dst->tclassid)) {
|
||||
if (unlikely(skb_dst(skb)->tclassid)) {
|
||||
struct ip_rt_acct *st = per_cpu_ptr(ip_rt_acct, smp_processor_id());
|
||||
u32 idx = skb->dst->tclassid;
|
||||
u32 idx = skb_dst(skb)->tclassid;
|
||||
st[idx&0xFF].o_packets++;
|
||||
st[idx&0xFF].o_bytes += skb->len;
|
||||
st[(idx>>16)&0xFF].i_packets++;
|
||||
|
@@ -143,7 +143,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
|
||||
__be32 addr;
|
||||
|
||||
memcpy(&addr, sptr+soffset-1, 4);
|
||||
if (inet_addr_type(dev_net(skb->dst->dev), addr) != RTN_LOCAL) {
|
||||
if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_LOCAL) {
|
||||
dopt->ts_needtime = 1;
|
||||
soffset += 8;
|
||||
}
|
||||
@@ -624,12 +624,12 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
||||
memcpy(&nexthop, &optptr[srrptr-1], 4);
|
||||
|
||||
rt = skb_rtable(skb);
|
||||
skb->dst = NULL;
|
||||
skb_dst_set(skb, NULL);
|
||||
err = ip_route_input(skb, nexthop, iph->saddr, iph->tos, skb->dev);
|
||||
rt2 = skb_rtable(skb);
|
||||
if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) {
|
||||
ip_rt_put(rt2);
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
return -EINVAL;
|
||||
}
|
||||
ip_rt_put(rt);
|
||||
|
@@ -95,7 +95,7 @@ int __ip_local_out(struct sk_buff *skb)
|
||||
|
||||
iph->tot_len = htons(skb->len);
|
||||
ip_send_check(iph);
|
||||
return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb->dst->dev,
|
||||
return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev,
|
||||
dst_output);
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
|
||||
__skb_pull(newskb, skb_network_offset(newskb));
|
||||
newskb->pkt_type = PACKET_LOOPBACK;
|
||||
newskb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
WARN_ON(!newskb->dst);
|
||||
WARN_ON(!skb_dst(newskb));
|
||||
netif_rx(newskb);
|
||||
return 0;
|
||||
}
|
||||
@@ -176,7 +176,7 @@ EXPORT_SYMBOL_GPL(ip_build_and_send_pkt);
|
||||
|
||||
static inline int ip_finish_output2(struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb->dst;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct rtable *rt = (struct rtable *)dst;
|
||||
struct net_device *dev = dst->dev;
|
||||
unsigned int hh_len = LL_RESERVED_SPACE(dev);
|
||||
@@ -217,14 +217,14 @@ static inline int ip_skb_dst_mtu(struct sk_buff *skb)
|
||||
struct inet_sock *inet = skb->sk ? inet_sk(skb->sk) : NULL;
|
||||
|
||||
return (inet && inet->pmtudisc == IP_PMTUDISC_PROBE) ?
|
||||
skb->dst->dev->mtu : dst_mtu(skb->dst);
|
||||
skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
|
||||
}
|
||||
|
||||
static int ip_finish_output(struct sk_buff *skb)
|
||||
{
|
||||
#if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM)
|
||||
/* Policy lookup after SNAT yielded a new policy */
|
||||
if (skb->dst->xfrm != NULL) {
|
||||
if (skb_dst(skb)->xfrm != NULL) {
|
||||
IPCB(skb)->flags |= IPSKB_REROUTED;
|
||||
return dst_output(skb);
|
||||
}
|
||||
@@ -296,7 +296,7 @@ int ip_mc_output(struct sk_buff *skb)
|
||||
|
||||
int ip_output(struct sk_buff *skb)
|
||||
{
|
||||
struct net_device *dev = skb->dst->dev;
|
||||
struct net_device *dev = skb_dst(skb)->dev;
|
||||
|
||||
IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len);
|
||||
|
||||
@@ -355,7 +355,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
|
||||
}
|
||||
sk_setup_caps(sk, &rt->u.dst);
|
||||
}
|
||||
skb->dst = dst_clone(&rt->u.dst);
|
||||
skb_dst_set(skb, dst_clone(&rt->u.dst));
|
||||
|
||||
packet_routed:
|
||||
if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
|
||||
@@ -401,8 +401,8 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
|
||||
to->pkt_type = from->pkt_type;
|
||||
to->priority = from->priority;
|
||||
to->protocol = from->protocol;
|
||||
dst_release(to->dst);
|
||||
to->dst = dst_clone(from->dst);
|
||||
skb_dst_drop(to);
|
||||
skb_dst_set(to, dst_clone(skb_dst(from)));
|
||||
to->dev = from->dev;
|
||||
to->mark = from->mark;
|
||||
|
||||
@@ -1294,7 +1294,7 @@ int ip_push_pending_frames(struct sock *sk)
|
||||
* on dst refcount
|
||||
*/
|
||||
inet->cork.dst = NULL;
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
|
||||
if (iph->protocol == IPPROTO_ICMP)
|
||||
icmp_out_count(net, ((struct icmphdr *)
|
||||
|
@@ -370,8 +370,7 @@ static int ipip_rcv(struct sk_buff *skb)
|
||||
tunnel->dev->stats.rx_packets++;
|
||||
tunnel->dev->stats.rx_bytes += skb->len;
|
||||
skb->dev = tunnel->dev;
|
||||
dst_release(skb->dst);
|
||||
skb->dst = NULL;
|
||||
skb_dst_drop(skb);
|
||||
nf_reset(skb);
|
||||
ipip_ecn_decapsulate(iph, skb);
|
||||
netif_rx(skb);
|
||||
@@ -447,15 +446,15 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if (tiph->frag_off)
|
||||
mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
|
||||
else
|
||||
mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu;
|
||||
mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
|
||||
|
||||
if (mtu < 68) {
|
||||
stats->collisions++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
if (skb->dst)
|
||||
skb->dst->ops->update_pmtu(skb->dst, mtu);
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
|
||||
df |= (old_iph->frag_off&htons(IP_DF));
|
||||
|
||||
@@ -502,8 +501,8 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||
IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
|
||||
IPSKB_REROUTED);
|
||||
dst_release(skb->dst);
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
|
||||
/*
|
||||
* Push down and install the IPIP header.
|
||||
|
@@ -651,7 +651,7 @@ static int ipmr_cache_report(struct net *net,
|
||||
ip_hdr(skb)->protocol = 0; /* Flag to the kernel this is a route add */
|
||||
msg = (struct igmpmsg *)skb_network_header(skb);
|
||||
msg->im_vif = vifi;
|
||||
skb->dst = dst_clone(pkt->dst);
|
||||
skb_dst_set(skb, dst_clone(skb_dst(pkt)));
|
||||
|
||||
/*
|
||||
* Add our header
|
||||
@@ -1201,7 +1201,7 @@ static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr)
|
||||
iph->protocol = IPPROTO_IPIP;
|
||||
iph->ihl = 5;
|
||||
iph->tot_len = htons(skb->len);
|
||||
ip_select_ident(iph, skb->dst, NULL);
|
||||
ip_select_ident(iph, skb_dst(skb), NULL);
|
||||
ip_send_check(iph);
|
||||
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||
@@ -1212,7 +1212,7 @@ static inline int ipmr_forward_finish(struct sk_buff *skb)
|
||||
{
|
||||
struct ip_options * opt = &(IPCB(skb)->opt);
|
||||
|
||||
IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS);
|
||||
|
||||
if (unlikely(opt->optlen))
|
||||
ip_forward_options(skb);
|
||||
@@ -1290,8 +1290,8 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)
|
||||
vif->pkt_out++;
|
||||
vif->bytes_out += skb->len;
|
||||
|
||||
dst_release(skb->dst);
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
ip_decrease_ttl(ip_hdr(skb));
|
||||
|
||||
/* FIXME: forward and output firewalls used to be called here.
|
||||
@@ -1543,8 +1543,7 @@ static int __pim_rcv(struct sk_buff *skb, unsigned int pimlen)
|
||||
skb->protocol = htons(ETH_P_IP);
|
||||
skb->ip_summed = 0;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
dst_release(skb->dst);
|
||||
skb->dst = NULL;
|
||||
skb_dst_drop(skb);
|
||||
reg_dev->stats.rx_bytes += skb->len;
|
||||
reg_dev->stats.rx_packets++;
|
||||
nf_reset(skb);
|
||||
|
@@ -12,7 +12,7 @@
|
||||
/* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */
|
||||
int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
||||
{
|
||||
struct net *net = dev_net(skb->dst->dev);
|
||||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
struct rtable *rt;
|
||||
struct flowi fl = {};
|
||||
@@ -41,8 +41,8 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
||||
return -1;
|
||||
|
||||
/* Drop old route. */
|
||||
dst_release(skb->dst);
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
} else {
|
||||
/* non-local src, find valid iif to satisfy
|
||||
* rp-filter when calling ip_route_input. */
|
||||
@@ -50,7 +50,7 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
||||
if (ip_route_output_key(net, &rt, &fl) != 0)
|
||||
return -1;
|
||||
|
||||
odst = skb->dst;
|
||||
odst = skb_dst(skb);
|
||||
if (ip_route_input(skb, iph->daddr, iph->saddr,
|
||||
RT_TOS(iph->tos), rt->u.dst.dev) != 0) {
|
||||
dst_release(&rt->u.dst);
|
||||
@@ -60,18 +60,22 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
||||
dst_release(odst);
|
||||
}
|
||||
|
||||
if (skb->dst->error)
|
||||
if (skb_dst(skb)->error)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
if (!(IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) &&
|
||||
xfrm_decode_session(skb, &fl, AF_INET) == 0)
|
||||
if (xfrm_lookup(net, &skb->dst, &fl, skb->sk, 0))
|
||||
xfrm_decode_session(skb, &fl, AF_INET) == 0) {
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
skb_dst_set(skb, NULL);
|
||||
if (xfrm_lookup(net, &dst, &fl, skb->sk, 0))
|
||||
return -1;
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Change in oif may mean change in hh_len. */
|
||||
hh_len = skb->dst->dev->hard_header_len;
|
||||
hh_len = skb_dst(skb)->dev->hard_header_len;
|
||||
if (skb_headroom(skb) < hh_len &&
|
||||
pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC))
|
||||
return -1;
|
||||
@@ -92,7 +96,7 @@ int ip_xfrm_me_harder(struct sk_buff *skb)
|
||||
if (xfrm_decode_session(skb, &fl, AF_INET) < 0)
|
||||
return -1;
|
||||
|
||||
dst = skb->dst;
|
||||
dst = skb_dst(skb);
|
||||
if (dst->xfrm)
|
||||
dst = ((struct xfrm_dst *)dst)->route;
|
||||
dst_hold(dst);
|
||||
@@ -100,11 +104,11 @@ int ip_xfrm_me_harder(struct sk_buff *skb)
|
||||
if (xfrm_lookup(dev_net(dst->dev), &dst, &fl, skb->sk, 0) < 0)
|
||||
return -1;
|
||||
|
||||
dst_release(skb->dst);
|
||||
skb->dst = dst;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
|
||||
/* Change in oif may mean change in hh_len. */
|
||||
hh_len = skb->dst->dev->hard_header_len;
|
||||
hh_len = skb_dst(skb)->dev->hard_header_len;
|
||||
if (skb_headroom(skb) < hh_len &&
|
||||
pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC))
|
||||
return -1;
|
||||
|
@@ -108,17 +108,16 @@ static void send_reset(struct sk_buff *oldskb, int hook)
|
||||
addr_type = RTN_LOCAL;
|
||||
|
||||
/* ip_route_me_harder expects skb->dst to be set */
|
||||
dst_hold(oldskb->dst);
|
||||
nskb->dst = oldskb->dst;
|
||||
skb_dst_set(nskb, dst_clone(skb_dst(oldskb)));
|
||||
|
||||
if (ip_route_me_harder(nskb, addr_type))
|
||||
goto free_nskb;
|
||||
|
||||
niph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT);
|
||||
niph->ttl = dst_metric(skb_dst(nskb), RTAX_HOPLIMIT);
|
||||
nskb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
/* "Never happens" */
|
||||
if (nskb->len > dst_mtu(nskb->dst))
|
||||
if (nskb->len > dst_mtu(skb_dst(nskb)))
|
||||
goto free_nskb;
|
||||
|
||||
nf_ct_attach(nskb, oldskb);
|
||||
|
@@ -167,10 +167,9 @@ nf_nat_in(unsigned int hooknum,
|
||||
|
||||
ret = nf_nat_fn(hooknum, skb, in, out, okfn);
|
||||
if (ret != NF_DROP && ret != NF_STOLEN &&
|
||||
daddr != ip_hdr(skb)->daddr) {
|
||||
dst_release(skb->dst);
|
||||
skb->dst = NULL;
|
||||
}
|
||||
daddr != ip_hdr(skb)->daddr)
|
||||
skb_dst_drop(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -343,7 +343,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
|
||||
|
||||
skb->priority = sk->sk_priority;
|
||||
skb->mark = sk->sk_mark;
|
||||
skb->dst = dst_clone(&rt->u.dst);
|
||||
skb_dst_set(skb, dst_clone(&rt->u.dst));
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
iph = ip_hdr(skb);
|
||||
|
@@ -1118,7 +1118,7 @@ restart:
|
||||
if (rp)
|
||||
*rp = rth;
|
||||
else
|
||||
skb->dst = &rth->u.dst;
|
||||
skb_dst_set(skb, &rth->u.dst);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1217,7 +1217,7 @@ restart:
|
||||
if (rp)
|
||||
*rp = rt;
|
||||
else
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2251,7 +2251,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
dst_use(&rth->u.dst, jiffies);
|
||||
RT_CACHE_STAT_INC(in_hit);
|
||||
rcu_read_unlock();
|
||||
skb->dst = &rth->u.dst;
|
||||
skb_dst_set(skb, &rth->u.dst);
|
||||
return 0;
|
||||
}
|
||||
RT_CACHE_STAT_INC(in_hlist_search);
|
||||
@@ -2934,7 +2934,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
|
||||
if (err)
|
||||
goto errout_free;
|
||||
|
||||
skb->dst = &rt->u.dst;
|
||||
skb_dst_set(skb, &rt->u.dst);
|
||||
if (rtm->rtm_flags & RTM_F_NOTIFY)
|
||||
rt->rt_flags |= RTCF_NOTIFY;
|
||||
|
||||
@@ -2975,15 +2975,15 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
continue;
|
||||
if (rt_is_expired(rt))
|
||||
continue;
|
||||
skb->dst = dst_clone(&rt->u.dst);
|
||||
skb_dst_set(skb, dst_clone(&rt->u.dst));
|
||||
if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid,
|
||||
cb->nlh->nlmsg_seq, RTM_NEWROUTE,
|
||||
1, NLM_F_MULTI) <= 0) {
|
||||
dst_release(xchg(&skb->dst, NULL));
|
||||
skb_dst_drop(skb);
|
||||
rcu_read_unlock_bh();
|
||||
goto done;
|
||||
}
|
||||
dst_release(xchg(&skb->dst, NULL));
|
||||
skb_dst_drop(skb);
|
||||
}
|
||||
rcu_read_unlock_bh();
|
||||
}
|
||||
|
@@ -590,7 +590,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
||||
arg.csumoffset = offsetof(struct tcphdr, check) / 2;
|
||||
arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0;
|
||||
|
||||
net = dev_net(skb->dst->dev);
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
ip_send_reply(net->ipv4.tcp_sock, skb,
|
||||
&arg, arg.iov[0].iov_len);
|
||||
|
||||
@@ -617,7 +617,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
||||
];
|
||||
} rep;
|
||||
struct ip_reply_arg arg;
|
||||
struct net *net = dev_net(skb->dst->dev);
|
||||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
|
||||
memset(&rep.th, 0, sizeof(struct tcphdr));
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
|
@@ -2202,7 +2202,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
||||
/* Reserve space for headers. */
|
||||
skb_reserve(skb, MAX_TCP_HEADER);
|
||||
|
||||
skb->dst = dst_clone(dst);
|
||||
skb_dst_set(skb, dst_clone(dst));
|
||||
|
||||
mss = dst_metric(dst, RTAX_ADVMSS);
|
||||
if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss)
|
||||
|
@@ -328,7 +328,7 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb,
|
||||
if (unlikely(sk = skb_steal_sock(skb)))
|
||||
return sk;
|
||||
else
|
||||
return __udp4_lib_lookup(dev_net(skb->dst->dev), iph->saddr, sport,
|
||||
return __udp4_lib_lookup(dev_net(skb_dst(skb)->dev), iph->saddr, sport,
|
||||
iph->daddr, dport, inet_iif(skb),
|
||||
udptable);
|
||||
}
|
||||
@@ -1237,7 +1237,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
|
||||
struct sock *sk;
|
||||
struct udphdr *uh;
|
||||
unsigned short ulen;
|
||||
struct rtable *rt = (struct rtable*)skb->dst;
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
__be32 saddr, daddr;
|
||||
struct net *net = dev_net(skb->dev);
|
||||
|
||||
|
@@ -23,7 +23,7 @@ int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
|
||||
static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb)
|
||||
{
|
||||
if (skb->dst == NULL) {
|
||||
if (skb_dst(skb) == NULL) {
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
|
||||
|
@@ -28,7 +28,7 @@ static inline void ipip_ecn_decapsulate(struct sk_buff *skb)
|
||||
*/
|
||||
static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb->dst;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct iphdr *top_iph;
|
||||
int flags;
|
||||
|
||||
@@ -41,7 +41,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
top_iph->ihl = 5;
|
||||
top_iph->version = 4;
|
||||
|
||||
top_iph->protocol = xfrm_af2proto(skb->dst->ops->family);
|
||||
top_iph->protocol = xfrm_af2proto(skb_dst(skb)->ops->family);
|
||||
|
||||
/* DS disclosed */
|
||||
top_iph->tos = INET_ECN_encapsulate(XFRM_MODE_SKB_CB(skb)->tos,
|
||||
|
@@ -29,7 +29,7 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb)
|
||||
if (!(ip_hdr(skb)->frag_off & htons(IP_DF)) || skb->local_df)
|
||||
goto out;
|
||||
|
||||
dst = skb->dst;
|
||||
dst = skb_dst(skb);
|
||||
mtu = dst_mtu(dst);
|
||||
if (skb->len > mtu) {
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
||||
@@ -72,7 +72,7 @@ EXPORT_SYMBOL(xfrm4_prepare_output);
|
||||
static int xfrm4_output_finish(struct sk_buff *skb)
|
||||
{
|
||||
#ifdef CONFIG_NETFILTER
|
||||
if (!skb->dst->xfrm) {
|
||||
if (!skb_dst(skb)->xfrm) {
|
||||
IPCB(skb)->flags |= IPSKB_REROUTED;
|
||||
return dst_output(skb);
|
||||
}
|
||||
@@ -87,6 +87,6 @@ static int xfrm4_output_finish(struct sk_buff *skb)
|
||||
int xfrm4_output(struct sk_buff *skb)
|
||||
{
|
||||
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb,
|
||||
NULL, skb->dst->dev, xfrm4_output_finish,
|
||||
NULL, skb_dst(skb)->dev, xfrm4_output_finish,
|
||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||
}
|
||||
|
Reference in New Issue
Block a user