Skip to content

Commit fd0273d

Browse files
iamkafaidavem330
authored andcommitted
ipv6: Remove external dependency on rt6i_dst and rt6i_src
This patch removes the assumptions that the returned rt is always a RTF_CACHE entry with the rt6i_dst and rt6i_src containing the destination and source address. The dst and src can be recovered from the calling site. We may consider to rename (rt6i_dst, rt6i_src) to (rt6i_key_dst, rt6i_key_src) later. Signed-off-by: Martin KaFai Lau <[email protected]> Reviewed-by: Hannes Frederic Sowa <[email protected]> Cc: Steffen Klassert <[email protected]> Cc: Julian Anastasov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 286c234 commit fd0273d

File tree

9 files changed

+25
-17
lines changed

9 files changed

+25
-17
lines changed

drivers/scsi/cxgbi/libcxgbi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ static struct cxgbi_sock *cxgbi_check_route6(struct sockaddr *dst_addr)
728728
}
729729
ndev = n->dev;
730730

731-
if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) {
731+
if (ipv6_addr_is_multicast(&daddr6->sin6_addr)) {
732732
pr_info("multi-cast route %pI6 port %u, dev %s.\n",
733733
daddr6->sin6_addr.s6_addr,
734734
ntohs(daddr6->sin6_port), ndev->name);

include/net/ipv6.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,9 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add
671671
return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
672672
}
673673

674-
u32 ipv6_select_ident(struct net *net, struct rt6_info *rt);
674+
u32 ipv6_select_ident(struct net *net,
675+
const struct in6_addr *daddr,
676+
const struct in6_addr *saddr);
675677
void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
676678

677679
int ip6_dst_hoplimit(struct dst_entry *dst);

net/ipv6/icmp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
207207
struct inet_peer *peer;
208208

209209
peer = inet_getpeer_v6(net->ipv6.peers,
210-
&rt->rt6i_dst.addr, 1);
210+
&fl6->daddr, 1);
211211
res = inet_peer_xrlim_allow(peer, tmo);
212212
if (peer)
213213
inet_putpeer(peer);

net/ipv6/ip6_output.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ int ip6_forward(struct sk_buff *skb)
459459
else
460460
target = &hdr->daddr;
461461

462-
peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
462+
peer = inet_getpeer_v6(net->ipv6.peers, &hdr->daddr, 1);
463463

464464
/* Limit redirects both by destination (here)
465465
and by source (inside ndisc_send_redirect)
@@ -584,7 +584,8 @@ int ip6_fragment(struct sock *sk, struct sk_buff *skb,
584584
}
585585
mtu -= hlen + sizeof(struct frag_hdr);
586586

587-
frag_id = ipv6_select_ident(net, rt);
587+
frag_id = ipv6_select_ident(net, &ipv6_hdr(skb)->daddr,
588+
&ipv6_hdr(skb)->saddr);
588589

589590
if (skb_has_frag_list(skb)) {
590591
int first_len = skb_pagelen(skb);
@@ -1057,7 +1058,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
10571058
int odd, struct sk_buff *skb),
10581059
void *from, int length, int hh_len, int fragheaderlen,
10591060
int transhdrlen, int mtu, unsigned int flags,
1060-
struct rt6_info *rt)
1061+
const struct flowi6 *fl6)
10611062

10621063
{
10631064
struct sk_buff *skb;
@@ -1102,7 +1103,9 @@ static inline int ip6_ufo_append_data(struct sock *sk,
11021103
skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
11031104
sizeof(struct frag_hdr)) & ~7;
11041105
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
1105-
skb_shinfo(skb)->ip6_frag_id = ipv6_select_ident(sock_net(sk), rt);
1106+
skb_shinfo(skb)->ip6_frag_id = ipv6_select_ident(sock_net(sk),
1107+
&fl6->daddr,
1108+
&fl6->saddr);
11061109

11071110
append:
11081111
return skb_append_datato_frags(sk, skb, getfrag, from,
@@ -1327,7 +1330,7 @@ static int __ip6_append_data(struct sock *sk,
13271330
(sk->sk_type == SOCK_DGRAM)) {
13281331
err = ip6_ufo_append_data(sk, queue, getfrag, from, length,
13291332
hh_len, fragheaderlen,
1330-
transhdrlen, mtu, flags, rt);
1333+
transhdrlen, mtu, flags, fl6);
13311334
if (err)
13321335
goto error;
13331336
return 0;

net/ipv6/ndisc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
15061506
"Redirect: destination is not a neighbour\n");
15071507
goto release;
15081508
}
1509-
peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
1509+
peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
15101510
ret = inet_peer_xrlim_allow(peer, 1*HZ);
15111511
if (peer)
15121512
inet_putpeer(peer);

net/ipv6/output_core.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
#include <net/secure_seq.h>
1111

1212
static u32 __ipv6_select_ident(struct net *net, u32 hashrnd,
13-
struct in6_addr *dst, struct in6_addr *src)
13+
const struct in6_addr *dst,
14+
const struct in6_addr *src)
1415
{
1516
u32 hash, id;
1617

@@ -60,15 +61,16 @@ void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb)
6061
}
6162
EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident);
6263

63-
u32 ipv6_select_ident(struct net *net, struct rt6_info *rt)
64+
u32 ipv6_select_ident(struct net *net,
65+
const struct in6_addr *daddr,
66+
const struct in6_addr *saddr)
6467
{
6568
static u32 ip6_idents_hashrnd __read_mostly;
6669
u32 id;
6770

6871
net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd));
6972

70-
id = __ipv6_select_ident(net, ip6_idents_hashrnd, &rt->rt6i_dst.addr,
71-
&rt->rt6i_src.addr);
73+
id = __ipv6_select_ident(net, ip6_idents_hashrnd, daddr, saddr);
7274
return htonl(id);
7375
}
7476
EXPORT_SYMBOL(ipv6_select_ident);

net/ipv6/tcp_ipv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
262262
rt = (struct rt6_info *) dst;
263263
if (tcp_death_row.sysctl_tw_recycle &&
264264
!tp->rx_opt.ts_recent_stamp &&
265-
ipv6_addr_equal(&rt->rt6i_dst.addr, &sk->sk_v6_daddr))
265+
ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr))
266266
tcp_fetch_timewait_stamp(sk, dst);
267267

268268
icsk->icsk_ext_hdr_len = 0;

net/netfilter/ipvs/ip_vs_xmit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
781781

782782
/* From world but DNAT to loopback address? */
783783
if (local && skb->dev && !(skb->dev->flags & IFF_LOOPBACK) &&
784-
ipv6_addr_type(&rt->rt6i_dst.addr) & IPV6_ADDR_LOOPBACK) {
784+
ipv6_addr_type(&cp->daddr.in6) & IPV6_ADDR_LOOPBACK) {
785785
IP_VS_DBG_RL_PKT(1, AF_INET6, pp, skb, 0,
786786
"ip_vs_nat_xmit_v6(): "
787787
"stopping DNAT to loopback address");
@@ -1346,7 +1346,7 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
13461346

13471347
/* From world but DNAT to loopback address? */
13481348
if (local && skb->dev && !(skb->dev->flags & IFF_LOOPBACK) &&
1349-
ipv6_addr_type(&rt->rt6i_dst.addr) & IPV6_ADDR_LOOPBACK) {
1349+
ipv6_addr_type(&cp->daddr.in6) & IPV6_ADDR_LOOPBACK) {
13501350
IP_VS_DBG(1, "%s(): "
13511351
"stopping DNAT to loopback %pI6\n",
13521352
__func__, &cp->daddr.in6);

net/sctp/ipv6.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
332332
rt = (struct rt6_info *)dst;
333333
t->dst = dst;
334334
t->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
335-
pr_debug("rt6_dst:%pI6 rt6_src:%pI6\n", &rt->rt6i_dst.addr,
335+
pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n",
336+
&rt->rt6i_dst.addr, rt->rt6i_dst.plen,
336337
&fl6->saddr);
337338
} else {
338339
t->dst = NULL;

0 commit comments

Comments
 (0)