Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9cf7b56 authored by Willem de Bruijn's avatar Willem de Bruijn Committed by Gerrit - the friendly Code Review server
Browse files

udp: expose inet cork to udp



UDP segmentation offload needs access to inet_cork in the udp layer.
Pass the struct to ip(6)_make_skb instead of allocating it on the
stack in that function itself.

This patch is a noop otherwise.

Change-Id: I75917a4f2f27aa26133d466663913fec4ae48470
Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Git-commit: 1cd7884dfd78df6284d27b008823b0b4a808f196
Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git


Signed-off-by: default avatarSean Tranchetti <stranche@codeaurora.org>
parent 2b1dcbe4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ struct sk_buff *ip_make_skb(struct sock *sk, struct flowi4 *fl4,
					int len, int odd, struct sk_buff *skb),
			    void *from, int length, int transhdrlen,
			    struct ipcm_cookie *ipc, struct rtable **rtp,
			    unsigned int flags);
			    struct inet_cork *cork, unsigned int flags);

static inline struct sk_buff *ip_finish_skb(struct sock *sk, struct flowi4 *fl4)
{
+1 −0
Original line number Diff line number Diff line
@@ -905,6 +905,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
			     void *from, int length, int transhdrlen,
			     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
			     struct rt6_info *rt, unsigned int flags,
			     struct inet_cork_full *cork,
			     const struct sockcm_cookie *sockc);

static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
+8 −9
Original line number Diff line number Diff line
@@ -1460,9 +1460,8 @@ struct sk_buff *ip_make_skb(struct sock *sk,
					int len, int odd, struct sk_buff *skb),
			    void *from, int length, int transhdrlen,
			    struct ipcm_cookie *ipc, struct rtable **rtp,
			    unsigned int flags)
			    struct inet_cork *cork, unsigned int flags)
{
	struct inet_cork cork;
	struct sk_buff_head queue;
	int err;

@@ -1471,22 +1470,22 @@ struct sk_buff *ip_make_skb(struct sock *sk,

	__skb_queue_head_init(&queue);

	cork.flags = 0;
	cork.addr = 0;
	cork.opt = NULL;
	err = ip_setup_cork(sk, &cork, ipc, rtp);
	cork->flags = 0;
	cork->addr = 0;
	cork->opt = NULL;
	err = ip_setup_cork(sk, cork, ipc, rtp);
	if (err)
		return ERR_PTR(err);

	err = __ip_append_data(sk, fl4, &queue, &cork,
	err = __ip_append_data(sk, fl4, &queue, cork,
			       &current->task_frag, getfrag,
			       from, length, transhdrlen, flags);
	if (err) {
		__ip_flush_pending_frames(sk, &queue, &cork);
		__ip_flush_pending_frames(sk, &queue, cork);
		return ERR_PTR(err);
	}

	return __ip_make_skb(sk, fl4, &queue, &cork);
	return __ip_make_skb(sk, fl4, &queue, cork);
}

/*
+3 −1
Original line number Diff line number Diff line
@@ -1048,9 +1048,11 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)

	/* Lockless fast path for the non-corking case. */
	if (!corkreq) {
		struct inet_cork cork;

		skb = ip_make_skb(sk, fl4, getfrag, msg, ulen,
				  sizeof(struct udphdr), &ipc, &rt,
				  msg->msg_flags);
				  &cork, msg->msg_flags);
		err = PTR_ERR(skb);
		if (!IS_ERR_OR_NULL(skb))
			err = udp_send_skb(skb, fl4);
+10 −10
Original line number Diff line number Diff line
@@ -1735,9 +1735,9 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
			     void *from, int length, int transhdrlen,
			     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
			     struct rt6_info *rt, unsigned int flags,
			     struct inet_cork_full *cork,
			     const struct sockcm_cookie *sockc)
{
	struct inet_cork_full cork;
	struct inet6_cork v6_cork;
	struct sk_buff_head queue;
	int exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
@@ -1748,27 +1748,27 @@ struct sk_buff *ip6_make_skb(struct sock *sk,

	__skb_queue_head_init(&queue);

	cork.base.flags = 0;
	cork.base.addr = 0;
	cork.base.opt = NULL;
	cork.base.dst = NULL;
	cork->base.flags = 0;
	cork->base.addr = 0;
	cork->base.opt = NULL;
	cork->base.dst = 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, fl6);
	if (err) {
		ip6_cork_release(&cork, &v6_cork);
		ip6_cork_release(cork, &v6_cork);
		return ERR_PTR(err);
	}
	if (ipc6->dontfrag < 0)
		ipc6->dontfrag = inet6_sk(sk)->dontfrag;

	err = __ip6_append_data(sk, fl6, &queue, &cork.base, &v6_cork,
	err = __ip6_append_data(sk, fl6, &queue, &cork->base, &v6_cork,
				&current->task_frag, getfrag, from,
				length + exthdrlen, transhdrlen + exthdrlen,
				flags, ipc6, sockc);
	if (err) {
		__ip6_flush_pending_frames(sk, &queue, &cork, &v6_cork);
		__ip6_flush_pending_frames(sk, &queue, cork, &v6_cork);
		return ERR_PTR(err);
	}

	return __ip6_make_skb(sk, &queue, &cork, &v6_cork);
	return __ip6_make_skb(sk, &queue, cork, &v6_cork);
}
Loading