Skip to content

Commit 91ed1e6

Browse files
Paolo Abenidavem330
authored andcommitted
ip/options: explicitly provide net ns to __ip_options_echo()
__ip_options_echo() uses the current network namespace, and currently retrives it via skb->dst->dev. This commit adds an explicit 'net' argument to __ip_options_echo() and update all the call sites to provide it, usually via a simpler sock_net(). After this change, __ip_options_echo() no more needs to access skb->dst and we can drop a couple of hack to preserve such info in the rx path. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a1e155e commit 91ed1e6

File tree

8 files changed

+20
-17
lines changed

8 files changed

+20
-17
lines changed

include/net/ip.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -567,11 +567,12 @@ int ip_forward(struct sk_buff *skb);
567567
void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
568568
__be32 daddr, struct rtable *rt, int is_frag);
569569

570-
int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
571-
const struct ip_options *sopt);
572-
static inline int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb)
570+
int __ip_options_echo(struct net *net, struct ip_options *dopt,
571+
struct sk_buff *skb, const struct ip_options *sopt);
572+
static inline int ip_options_echo(struct net *net, struct ip_options *dopt,
573+
struct sk_buff *skb)
573574
{
574-
return __ip_options_echo(dopt, skb, &IPCB(skb)->opt);
575+
return __ip_options_echo(net, dopt, skb, &IPCB(skb)->opt);
575576
}
576577

577578
void ip_options_fragment(struct sk_buff *skb);

include/net/tcp.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,7 +1885,8 @@ extern void tcp_rack_reo_timeout(struct sock *sk);
18851885
/*
18861886
* Save and compile IPv4 options, return a pointer to it
18871887
*/
1888-
static inline struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb)
1888+
static inline struct ip_options_rcu *tcp_v4_save_options(struct net *net,
1889+
struct sk_buff *skb)
18891890
{
18901891
const struct ip_options *opt = &TCP_SKB_CB(skb)->header.h4.opt;
18911892
struct ip_options_rcu *dopt = NULL;
@@ -1894,7 +1895,7 @@ static inline struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb)
18941895
int opt_size = sizeof(*dopt) + opt->optlen;
18951896

18961897
dopt = kmalloc(opt_size, GFP_ATOMIC);
1897-
if (dopt && __ip_options_echo(&dopt->opt, skb, opt)) {
1898+
if (dopt && __ip_options_echo(net, &dopt->opt, skb, opt)) {
18981899
kfree(dopt);
18991900
dopt = NULL;
19001901
}

net/ipv4/icmp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
412412
int type = icmp_param->data.icmph.type;
413413
int code = icmp_param->data.icmph.code;
414414

415-
if (ip_options_echo(&icmp_param->replyopts.opt.opt, skb))
415+
if (ip_options_echo(net, &icmp_param->replyopts.opt.opt, skb))
416416
return;
417417

418418
/* Needed by both icmp_global_allow and icmp_xmit_lock */
@@ -694,7 +694,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
694694
iph->tos;
695695
mark = IP4_REPLY_MARK(net, skb_in->mark);
696696

697-
if (ip_options_echo(&icmp_param.replyopts.opt.opt, skb_in))
697+
if (ip_options_echo(net, &icmp_param.replyopts.opt.opt, skb_in))
698698
goto out_unlock;
699699

700700

net/ipv4/ip_options.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
8686
* NOTE: dopt cannot point to skb.
8787
*/
8888

89-
int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
90-
const struct ip_options *sopt)
89+
int __ip_options_echo(struct net *net, struct ip_options *dopt,
90+
struct sk_buff *skb, const struct ip_options *sopt)
9191
{
9292
unsigned char *sptr, *dptr;
9393
int soffset, doffset;
@@ -140,7 +140,7 @@ int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
140140
__be32 addr;
141141

142142
memcpy(&addr, dptr+soffset-1, 4);
143-
if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_UNICAST) {
143+
if (inet_addr_type(net, addr) != RTN_UNICAST) {
144144
dopt->ts_needtime = 1;
145145
soffset += 8;
146146
}

net/ipv4/ip_output.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1525,7 +1525,7 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
15251525
int err;
15261526
int oif;
15271527

1528-
if (__ip_options_echo(&replyopts.opt.opt, skb, sopt))
1528+
if (__ip_options_echo(net, &replyopts.opt.opt, skb, sopt))
15291529
return;
15301530

15311531
ipc.addr = daddr;

net/ipv4/ip_sockglue.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,16 @@ static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
8080
}
8181

8282

83-
static void ip_cmsg_recv_retopts(struct msghdr *msg, struct sk_buff *skb)
83+
static void ip_cmsg_recv_retopts(struct net *net, struct msghdr *msg,
84+
struct sk_buff *skb)
8485
{
8586
unsigned char optbuf[sizeof(struct ip_options) + 40];
8687
struct ip_options *opt = (struct ip_options *)optbuf;
8788

8889
if (IPCB(skb)->opt.optlen == 0)
8990
return;
9091

91-
if (ip_options_echo(opt, skb)) {
92+
if (ip_options_echo(net, opt, skb)) {
9293
msg->msg_flags |= MSG_CTRUNC;
9394
return;
9495
}
@@ -204,7 +205,7 @@ void ip_cmsg_recv_offset(struct msghdr *msg, struct sock *sk,
204205
}
205206

206207
if (flags & IP_CMSG_RETOPTS) {
207-
ip_cmsg_recv_retopts(msg, skb);
208+
ip_cmsg_recv_retopts(sock_net(sk), msg, skb);
208209

209210
flags &= ~IP_CMSG_RETOPTS;
210211
if (!flags)

net/ipv4/syncookies.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)
355355
/* We throwed the options of the initial SYN away, so we hope
356356
* the ACK carries the same options again (see RFC1122 4.2.3.8)
357357
*/
358-
ireq->opt = tcp_v4_save_options(skb);
358+
ireq->opt = tcp_v4_save_options(sock_net(sk), skb);
359359

360360
if (security_inet_conn_request(sk, skb, req)) {
361361
reqsk_free(req);

net/ipv4/tcp_ipv4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ static void tcp_v4_init_req(struct request_sock *req,
12671267

12681268
sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr);
12691269
sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr);
1270-
ireq->opt = tcp_v4_save_options(skb);
1270+
ireq->opt = tcp_v4_save_options(sock_net(sk_listener), skb);
12711271
}
12721272

12731273
static struct dst_entry *tcp_v4_route_req(const struct sock *sk,

0 commit comments

Comments
 (0)