Commit f37a4cc6 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jakub Kicinski

udp6: pass flow in ip6_make_skb together with cork

Another preparation patch. inet_cork_full already contains a field for
iflow, so we can avoid passing a separate struct iflow6 into
__ip6_append_data() and ip6_make_skb(), and use the flow stored in
inet_cork_full. Make sure callers set cork->fl, i.e. we init it in
ip6_append_data() and before calling ip6_make_skb().
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f3b46a3e
...@@ -1020,7 +1020,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, ...@@ -1020,7 +1020,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
int getfrag(void *from, char *to, int offset, int getfrag(void *from, char *to, int offset,
int len, int odd, struct sk_buff *skb), int len, int odd, struct sk_buff *skb),
void *from, int length, int transhdrlen, void *from, int length, int transhdrlen,
struct ipcm6_cookie *ipc6, struct flowi6 *fl6, struct ipcm6_cookie *ipc6,
struct rt6_info *rt, unsigned int flags, struct rt6_info *rt, unsigned int flags,
struct inet_cork_full *cork); struct inet_cork_full *cork);
......
...@@ -1350,7 +1350,7 @@ static void ip6_append_data_mtu(unsigned int *mtu, ...@@ -1350,7 +1350,7 @@ static void ip6_append_data_mtu(unsigned int *mtu,
static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
struct inet6_cork *v6_cork, struct ipcm6_cookie *ipc6, struct inet6_cork *v6_cork, struct ipcm6_cookie *ipc6,
struct rt6_info *rt, struct flowi6 *fl6) struct rt6_info *rt)
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
unsigned int mtu; unsigned int mtu;
...@@ -1391,7 +1391,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, ...@@ -1391,7 +1391,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
} }
dst_hold(&rt->dst); dst_hold(&rt->dst);
cork->base.dst = &rt->dst; cork->base.dst = &rt->dst;
cork->fl.u.ip6 = *fl6;
v6_cork->hop_limit = ipc6->hlimit; v6_cork->hop_limit = ipc6->hlimit;
v6_cork->tclass = ipc6->tclass; v6_cork->tclass = ipc6->tclass;
if (rt->dst.flags & DST_XFRM_TUNNEL) if (rt->dst.flags & DST_XFRM_TUNNEL)
...@@ -1422,7 +1421,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, ...@@ -1422,7 +1421,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
} }
static int __ip6_append_data(struct sock *sk, static int __ip6_append_data(struct sock *sk,
struct flowi6 *fl6,
struct sk_buff_head *queue, struct sk_buff_head *queue,
struct inet_cork_full *cork_full, struct inet_cork_full *cork_full,
struct inet6_cork *v6_cork, struct inet6_cork *v6_cork,
...@@ -1434,6 +1432,7 @@ static int __ip6_append_data(struct sock *sk, ...@@ -1434,6 +1432,7 @@ static int __ip6_append_data(struct sock *sk,
{ {
struct sk_buff *skb, *skb_prev = NULL; struct sk_buff *skb, *skb_prev = NULL;
struct inet_cork *cork = &cork_full->base; struct inet_cork *cork = &cork_full->base;
struct flowi6 *fl6 = &cork_full->fl.u.ip6;
unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu; unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu;
struct ubuf_info *uarg = NULL; struct ubuf_info *uarg = NULL;
int exthdrlen = 0; int exthdrlen = 0;
...@@ -1786,19 +1785,19 @@ int ip6_append_data(struct sock *sk, ...@@ -1786,19 +1785,19 @@ int ip6_append_data(struct sock *sk,
* setup for corking * setup for corking
*/ */
err = ip6_setup_cork(sk, &inet->cork, &np->cork, err = ip6_setup_cork(sk, &inet->cork, &np->cork,
ipc6, rt, fl6); ipc6, rt);
if (err) if (err)
return err; return err;
inet->cork.fl.u.ip6 = *fl6;
exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0); exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
length += exthdrlen; length += exthdrlen;
transhdrlen += exthdrlen; transhdrlen += exthdrlen;
} else { } else {
fl6 = &inet->cork.fl.u.ip6;
transhdrlen = 0; transhdrlen = 0;
} }
return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork, return __ip6_append_data(sk, &sk->sk_write_queue, &inet->cork,
&np->cork, sk_page_frag(sk), getfrag, &np->cork, sk_page_frag(sk), getfrag,
from, length, transhdrlen, flags, ipc6); from, length, transhdrlen, flags, ipc6);
} }
...@@ -1967,9 +1966,8 @@ struct sk_buff *ip6_make_skb(struct sock *sk, ...@@ -1967,9 +1966,8 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
int getfrag(void *from, char *to, int offset, int getfrag(void *from, char *to, int offset,
int len, int odd, struct sk_buff *skb), int len, int odd, struct sk_buff *skb),
void *from, int length, int transhdrlen, void *from, int length, int transhdrlen,
struct ipcm6_cookie *ipc6, struct flowi6 *fl6, struct ipcm6_cookie *ipc6, struct rt6_info *rt,
struct rt6_info *rt, unsigned int flags, unsigned int flags, struct inet_cork_full *cork)
struct inet_cork_full *cork)
{ {
struct inet6_cork v6_cork; struct inet6_cork v6_cork;
struct sk_buff_head queue; struct sk_buff_head queue;
...@@ -1986,7 +1984,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, ...@@ -1986,7 +1984,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
cork->base.opt = NULL; cork->base.opt = NULL;
cork->base.dst = NULL; cork->base.dst = NULL;
v6_cork.opt = NULL; v6_cork.opt = NULL;
err = ip6_setup_cork(sk, cork, &v6_cork, ipc6, rt, fl6); err = ip6_setup_cork(sk, cork, &v6_cork, ipc6, rt);
if (err) { if (err) {
ip6_cork_release(cork, &v6_cork); ip6_cork_release(cork, &v6_cork);
return ERR_PTR(err); return ERR_PTR(err);
...@@ -1994,7 +1992,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, ...@@ -1994,7 +1992,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
if (ipc6->dontfrag < 0) if (ipc6->dontfrag < 0)
ipc6->dontfrag = inet6_sk(sk)->dontfrag; ipc6->dontfrag = inet6_sk(sk)->dontfrag;
err = __ip6_append_data(sk, fl6, &queue, cork, &v6_cork, err = __ip6_append_data(sk, &queue, cork, &v6_cork,
&current->task_frag, getfrag, from, &current->task_frag, getfrag, from,
length + exthdrlen, transhdrlen + exthdrlen, length + exthdrlen, transhdrlen + exthdrlen,
flags, ipc6); flags, ipc6);
......
...@@ -1533,9 +1533,11 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ...@@ -1533,9 +1533,11 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
struct inet_cork_full cork; struct inet_cork_full cork;
struct sk_buff *skb; struct sk_buff *skb;
cork.fl.u.ip6 = fl6;
skb = ip6_make_skb(sk, getfrag, msg, ulen, skb = ip6_make_skb(sk, getfrag, msg, ulen,
sizeof(struct udphdr), &ipc6, sizeof(struct udphdr), &ipc6,
&fl6, (struct rt6_info *)dst, (struct rt6_info *)dst,
msg->msg_flags, &cork); msg->msg_flags, &cork);
err = PTR_ERR(skb); err = PTR_ERR(skb);
if (!IS_ERR_OR_NULL(skb)) if (!IS_ERR_OR_NULL(skb))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment