Skip to content

Commit

Permalink
net: skb->rtable accessor
Browse files Browse the repository at this point in the history
Define skb_rtable(const struct sk_buff *skb) accessor to get rtable from skb

Delete skb->rtable field

Setting rtable is not allowed, just set dst instead as rtable is an alias.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Jun 3, 2009
1 parent dfbf97f commit 511c3f9
Show file tree
Hide file tree
Showing 23 changed files with 89 additions and 73 deletions.
2 changes: 1 addition & 1 deletion drivers/net/appletalk/ipddp.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ static struct net_device * __init ipddp_init(void)
*/
static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
{
__be32 paddr = ((struct rtable*)skb->dst)->rt_gateway;
__be32 paddr = skb_rtable(skb)->rt_gateway;
struct ddpehdr *ddp;
struct ipddp_route *rt;
struct atalk_addr *our_addr;
Expand Down
6 changes: 5 additions & 1 deletion include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,6 @@ struct sk_buff {

union {
struct dst_entry *dst;
struct rtable *rtable;
unsigned long _skb_dst;
};
#ifdef CONFIG_XFRM
Expand Down Expand Up @@ -427,6 +426,11 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb,
enum dma_data_direction dir);
#endif

static inline struct rtable *skb_rtable(const struct sk_buff *skb)
{
return (struct rtable *)skb->_skb_dst;
}

extern void kfree_skb(struct sk_buff *skb);
extern void consume_skb(struct sk_buff *skb);
extern void __kfree_skb(struct sk_buff *skb);
Expand Down
2 changes: 1 addition & 1 deletion include/net/route.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ static inline struct inet_peer *rt_get_peer(struct rtable *rt)

static inline int inet_iif(const struct sk_buff *skb)
{
return skb->rtable->rt_iif;
return skb_rtable(skb)->rt_iif;
}

#endif /* _ROUTE_H */
25 changes: 15 additions & 10 deletions net/bridge/br_netfilter.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,19 +228,21 @@ int nf_bridge_copy_header(struct sk_buff *skb)
static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
{
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
struct rtable *rt;

if (nf_bridge->mask & BRNF_PKT_TYPE) {
skb->pkt_type = PACKET_OTHERHOST;
nf_bridge->mask ^= BRNF_PKT_TYPE;
}
nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;

skb->rtable = bridge_parent_rtable(nf_bridge->physindev);
if (!skb->rtable) {
rt = bridge_parent_rtable(nf_bridge->physindev);
if (!rt) {
kfree_skb(skb);
return 0;
}
dst_hold(&skb->rtable->u.dst);
dst_hold(&rt->u.dst);
skb->dst = &rt->u.dst;

skb->dev = nf_bridge->physindev;
nf_bridge_push_encap_header(skb);
Expand Down Expand Up @@ -338,6 +340,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
struct net_device *dev = skb->dev;
struct iphdr *iph = ip_hdr(skb);
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
struct rtable *rt;
int err;

if (nf_bridge->mask & BRNF_PKT_TYPE) {
Expand All @@ -347,7 +350,6 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
if (dnat_took_place(skb)) {
if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
struct rtable *rt;
struct flowi fl = {
.nl_u = {
.ip4_u = {
Expand Down Expand Up @@ -404,12 +406,13 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
skb->pkt_type = PACKET_HOST;
}
} else {
skb->rtable = bridge_parent_rtable(nf_bridge->physindev);
if (!skb->rtable) {
rt = bridge_parent_rtable(nf_bridge->physindev);
if (!rt) {
kfree_skb(skb);
return 0;
}
dst_hold(&skb->rtable->u.dst);
dst_hold(&rt->u.dst);
skb->dst = &rt->u.dst;
}

skb->dev = nf_bridge->physindev;
Expand Down Expand Up @@ -628,9 +631,11 @@ static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff *skb,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
if (skb->rtable && skb->rtable == bridge_parent_rtable(in)) {
dst_release(&skb->rtable->u.dst);
skb->rtable = NULL;
struct rtable *rt = skb_rtable(skb);

if (rt && rt == bridge_parent_rtable(in)) {
dst_release(&rt->u.dst);
skb->dst = NULL;
}

return NF_ACCEPT;
Expand Down
6 changes: 3 additions & 3 deletions net/dccp/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk,
struct sk_buff *skb)
{
struct rtable *rt;
struct flowi fl = { .oif = skb->rtable->rt_iif,
struct flowi fl = { .oif = skb_rtable(skb)->rt_iif,
.nl_u = { .ip4_u =
{ .daddr = ip_hdr(skb)->saddr,
.saddr = ip_hdr(skb)->daddr,
Expand Down Expand Up @@ -514,7 +514,7 @@ static void dccp_v4_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET)
return;

if (rxskb->rtable->rt_type != RTN_LOCAL)
if (skb_rtable(rxskb)->rt_type != RTN_LOCAL)
return;

dst = dccp_v4_route_skb(net, ctl_sk, rxskb);
Expand Down Expand Up @@ -567,7 +567,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);

/* Never answer to DCCP_PKT_REQUESTs send to broadcast or multicast */
if (skb->rtable->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
return 0; /* discard, don't send a reset here */

if (dccp_bad_service_code(sk, service)) {
Expand Down
4 changes: 2 additions & 2 deletions net/ipv4/arp.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)
return 1;
}

paddr = skb->rtable->rt_gateway;
paddr = skb_rtable(skb)->rt_gateway;

if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, paddr, dev))
return 0;
Expand Down Expand Up @@ -817,7 +817,7 @@ static int arp_process(struct sk_buff *skb)
if (arp->ar_op == htons(ARPOP_REQUEST) &&
ip_route_input(skb, tip, sip, 0, dev) == 0) {

rt = skb->rtable;
rt = skb_rtable(skb);
addr_type = rt->rt_type;

if (addr_type == RTN_LOCAL) {
Expand Down
10 changes: 5 additions & 5 deletions net/ipv4/icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param,
static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
{
struct ipcm_cookie ipc;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct net *net = dev_net(rt->u.dst.dev);
struct sock *sk;
struct inet_sock *inet;
Expand Down Expand Up @@ -416,7 +416,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
struct iphdr *iph;
int room;
struct icmp_bxm icmp_param;
struct rtable *rt = skb_in->rtable;
struct rtable *rt = skb_rtable(skb_in);
struct ipcm_cookie ipc;
__be32 saddr;
u8 tos;
Expand Down Expand Up @@ -596,7 +596,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
RT_TOS(tos), rt2->u.dst.dev);

dst_release(&rt2->u.dst);
rt2 = skb_in->rtable;
rt2 = skb_rtable(skb_in);
skb_in->dst = odst;
}

Expand Down Expand Up @@ -926,7 +926,7 @@ static void icmp_address(struct sk_buff *skb)

static void icmp_address_reply(struct sk_buff *skb)
{
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct net_device *dev = skb->dev;
struct in_device *in_dev;
struct in_ifaddr *ifa;
Expand Down Expand Up @@ -970,7 +970,7 @@ static void icmp_discard(struct sk_buff *skb)
int icmp_rcv(struct sk_buff *skb)
{
struct icmphdr *icmph;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct net *net = dev_net(rt->u.dst.dev);

if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/igmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,7 @@ int igmp_rcv(struct sk_buff *skb)
case IGMPV2_HOST_MEMBERSHIP_REPORT:
case IGMPV3_HOST_MEMBERSHIP_REPORT:
/* Is it our report looped back? */
if (skb->rtable->fl.iif == 0)
if (skb_rtable(skb)->fl.iif == 0)
break;
/* don't rely on MC router hearing unicast reports */
if (skb->pkt_type == PACKET_MULTICAST ||
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/ip_forward.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ int ip_forward(struct sk_buff *skb)
if (!xfrm4_route_forward(skb))
goto drop;

rt = skb->rtable;
rt = skb_rtable(skb);

if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
goto sr_failed;
Expand Down
4 changes: 2 additions & 2 deletions net/ipv4/ip_gre.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,7 +602,7 @@ static int ipgre_rcv(struct sk_buff *skb)
#ifdef CONFIG_NET_IPGRE_BROADCAST
if (ipv4_is_multicast(iph->daddr)) {
/* Looped back packet, drop it! */
if (skb->rtable->fl.iif == 0)
if (skb_rtable(skb)->fl.iif == 0)
goto drop;
stats->multicast++;
skb->pkt_type = PACKET_BROADCAST;
Expand Down Expand Up @@ -704,7 +704,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
}

if (skb->protocol == htons(ETH_P_IP)) {
rt = skb->rtable;
rt = skb_rtable(skb);
if ((dst = rt->rt_gateway) == 0)
goto tx_error_icmp;
}
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/ip_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ static int ip_rcv_finish(struct sk_buff *skb)
if (iph->ihl > 5 && ip_rcv_options(skb))
goto drop;

rt = skb->rtable;
rt = skb_rtable(skb);
if (rt->rt_type == RTN_MULTICAST) {
IP_UPD_PO_STATS_BH(dev_net(rt->u.dst.dev), IPSTATS_MIB_INMCAST,
skb->len);
Expand Down
16 changes: 8 additions & 8 deletions net/ipv4/ip_options.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
sptr = skb_network_header(skb);
dptr = dopt->__data;

daddr = skb->rtable->rt_spec_dst;
daddr = skb_rtable(skb)->rt_spec_dst;

if (sopt->rr) {
optlen = sptr[sopt->rr+1];
Expand Down Expand Up @@ -257,7 +257,7 @@ int ip_options_compile(struct net *net,
struct rtable *rt = NULL;

if (skb != NULL) {
rt = skb->rtable;
rt = skb_rtable(skb);
optptr = (unsigned char *)&(ip_hdr(skb)[1]);
} else
optptr = opt->__data;
Expand Down Expand Up @@ -550,7 +550,7 @@ void ip_forward_options(struct sk_buff *skb)
{
struct ip_options * opt = &(IPCB(skb)->opt);
unsigned char * optptr;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
unsigned char *raw = skb_network_header(skb);

if (opt->rr_needaddr) {
Expand Down Expand Up @@ -598,7 +598,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
__be32 nexthop;
struct iphdr *iph = ip_hdr(skb);
unsigned char *optptr = skb_network_header(skb) + opt->srr;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct rtable *rt2;
int err;

Expand All @@ -623,13 +623,13 @@ int ip_options_rcv_srr(struct sk_buff *skb)
}
memcpy(&nexthop, &optptr[srrptr-1], 4);

rt = skb->rtable;
skb->rtable = NULL;
rt = skb_rtable(skb);
skb->dst = NULL;
err = ip_route_input(skb, nexthop, iph->saddr, iph->tos, skb->dev);
rt2 = skb->rtable;
rt2 = skb_rtable(skb);
if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) {
ip_rt_put(rt2);
skb->rtable = rt;
skb->dst = &rt->u.dst;
return -EINVAL;
}
ip_rt_put(rt);
Expand Down
10 changes: 5 additions & 5 deletions net/ipv4/ip_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
__be32 saddr, __be32 daddr, struct ip_options *opt)
{
struct inet_sock *inet = inet_sk(sk);
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct iphdr *iph;

/* Build the IP header. */
Expand Down Expand Up @@ -238,7 +238,7 @@ static int ip_finish_output(struct sk_buff *skb)
int ip_mc_output(struct sk_buff *skb)
{
struct sock *sk = skb->sk;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
struct net_device *dev = rt->u.dst.dev;

/*
Expand Down Expand Up @@ -319,7 +319,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
/* Skip all of this if the packet is already routed,
* f.e. by something like SCTP.
*/
rt = skb->rtable;
rt = skb_rtable(skb);
if (rt != NULL)
goto packet_routed;

Expand Down Expand Up @@ -440,7 +440,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
unsigned int mtu, hlen, left, len, ll_rs, pad;
int offset;
__be16 not_last_frag;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);
int err = 0;

dev = rt->u.dst.dev;
Expand Down Expand Up @@ -1362,7 +1362,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar
} replyopts;
struct ipcm_cookie ipc;
__be32 daddr;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);

if (ip_options_echo(&replyopts.opt, skb))
return;
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/ip_sockglue.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
{
struct in_pktinfo info;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);

info.ipi_addr.s_addr = ip_hdr(skb)->daddr;
if (rt) {
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/ipip.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)

if (!dst) {
/* NBMA tunnel */
if ((rt = skb->rtable) == NULL) {
if ((rt = skb_rtable(skb)) == NULL) {
stats->tx_fifo_errors++;
goto tx_error;
}
Expand Down
6 changes: 3 additions & 3 deletions net/ipv4/ipmr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1354,7 +1354,7 @@ static int ip_mr_forward(struct sk_buff *skb, struct mfc_cache *cache, int local
if (net->ipv4.vif_table[vif].dev != skb->dev) {
int true_vifi;

if (skb->rtable->fl.iif == 0) {
if (skb_rtable(skb)->fl.iif == 0) {
/* It is our own packet, looped back.
Very complicated situation...
Expand Down Expand Up @@ -1430,7 +1430,7 @@ int ip_mr_input(struct sk_buff *skb)
{
struct mfc_cache *cache;
struct net *net = dev_net(skb->dev);
int local = skb->rtable->rt_flags&RTCF_LOCAL;
int local = skb_rtable(skb)->rt_flags & RTCF_LOCAL;

/* Packet is looped back after forward, it should not be
forwarded second time, but still can be delivered locally.
Expand Down Expand Up @@ -1646,7 +1646,7 @@ int ipmr_get_route(struct net *net,
{
int err;
struct mfc_cache *cache;
struct rtable *rt = skb->rtable;
struct rtable *rt = skb_rtable(skb);

read_lock(&mrt_lock);
cache = ipmr_cache_find(net, rt->rt_src, rt->rt_dst);
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/netfilter/ipt_MASQUERADE.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ masquerade_tg(struct sk_buff *skb, const struct xt_target_param *par)
return NF_ACCEPT;

mr = par->targinfo;
rt = skb->rtable;
rt = skb_rtable(skb);
newsrc = inet_select_addr(par->out, rt->rt_gateway, RT_SCOPE_UNIVERSE);
if (!newsrc) {
printk("MASQUERADE: %s ate my IP address\n", par->out->name);
Expand Down
Loading

0 comments on commit 511c3f9

Please sign in to comment.