|
@@ -1158,8 +1158,7 @@ static void ip6_append_data_mtu(unsigned int *mtu,
|
|
|
|
|
|
static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|
|
struct inet6_cork *v6_cork, struct ipcm6_cookie *ipc6,
|
|
|
- struct rt6_info *rt, struct flowi6 *fl6,
|
|
|
- const struct sockcm_cookie *sockc)
|
|
|
+ struct rt6_info *rt, struct flowi6 *fl6)
|
|
|
{
|
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
|
unsigned int mtu;
|
|
@@ -1220,14 +1219,15 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|
|
if (mtu < IPV6_MIN_MTU)
|
|
|
return -EINVAL;
|
|
|
cork->base.fragsize = mtu;
|
|
|
- cork->base.gso_size = sk->sk_type == SOCK_DGRAM &&
|
|
|
- sk->sk_protocol == IPPROTO_UDP ? ipc6->gso_size : 0;
|
|
|
+ cork->base.gso_size = ipc6->gso_size;
|
|
|
+ cork->base.tx_flags = 0;
|
|
|
+ sock_tx_timestamp(sk, ipc6->sockc.tsflags, &cork->base.tx_flags);
|
|
|
|
|
|
if (dst_allfrag(xfrm_dst_path(&rt->dst)))
|
|
|
cork->base.flags |= IPCORK_ALLFRAG;
|
|
|
cork->base.length = 0;
|
|
|
|
|
|
- cork->base.transmit_time = sockc->transmit_time;
|
|
|
+ cork->base.transmit_time = ipc6->sockc.transmit_time;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1241,8 +1241,7 @@ static int __ip6_append_data(struct sock *sk,
|
|
|
int getfrag(void *from, char *to, int offset,
|
|
|
int len, int odd, struct sk_buff *skb),
|
|
|
void *from, int length, int transhdrlen,
|
|
|
- unsigned int flags, struct ipcm6_cookie *ipc6,
|
|
|
- const struct sockcm_cookie *sockc)
|
|
|
+ unsigned int flags, struct ipcm6_cookie *ipc6)
|
|
|
{
|
|
|
struct sk_buff *skb, *skb_prev = NULL;
|
|
|
unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu;
|
|
@@ -1252,7 +1251,6 @@ static int __ip6_append_data(struct sock *sk,
|
|
|
int copy;
|
|
|
int err;
|
|
|
int offset = 0;
|
|
|
- __u8 tx_flags = 0;
|
|
|
u32 tskey = 0;
|
|
|
struct rt6_info *rt = (struct rt6_info *)cork->dst;
|
|
|
struct ipv6_txoptions *opt = v6_cork->opt;
|
|
@@ -1271,6 +1269,10 @@ static int __ip6_append_data(struct sock *sk,
|
|
|
mtu = cork->gso_size ? IP6_MAX_MTU : cork->fragsize;
|
|
|
orig_mtu = mtu;
|
|
|
|
|
|
+ if (cork->tx_flags & SKBTX_ANY_SW_TSTAMP &&
|
|
|
+ sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)
|
|
|
+ tskey = sk->sk_tskey++;
|
|
|
+
|
|
|
hh_len = LL_RESERVED_SPACE(rt->dst.dev);
|
|
|
|
|
|
fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
|
|
@@ -1320,13 +1322,6 @@ emsgsize:
|
|
|
rt->dst.dev->features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM))
|
|
|
csummode = CHECKSUM_PARTIAL;
|
|
|
|
|
|
- if (sk->sk_type == SOCK_DGRAM || sk->sk_type == SOCK_RAW) {
|
|
|
- sock_tx_timestamp(sk, sockc->tsflags, &tx_flags);
|
|
|
- if (tx_flags & SKBTX_ANY_SW_TSTAMP &&
|
|
|
- sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)
|
|
|
- tskey = sk->sk_tskey++;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Let's try using as much space as possible.
|
|
|
* Use MTU if total length of the message fits into the MTU.
|
|
@@ -1445,8 +1440,8 @@ alloc_new_skb:
|
|
|
dst_exthdrlen);
|
|
|
|
|
|
/* Only the initial fragment is time stamped */
|
|
|
- skb_shinfo(skb)->tx_flags = tx_flags;
|
|
|
- tx_flags = 0;
|
|
|
+ skb_shinfo(skb)->tx_flags = cork->tx_flags;
|
|
|
+ cork->tx_flags = 0;
|
|
|
skb_shinfo(skb)->tskey = tskey;
|
|
|
tskey = 0;
|
|
|
|
|
@@ -1563,8 +1558,7 @@ int ip6_append_data(struct sock *sk,
|
|
|
int odd, struct sk_buff *skb),
|
|
|
void *from, int length, int transhdrlen,
|
|
|
struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
|
|
|
- struct rt6_info *rt, unsigned int flags,
|
|
|
- const struct sockcm_cookie *sockc)
|
|
|
+ struct rt6_info *rt, unsigned int flags)
|
|
|
{
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
@@ -1578,7 +1572,7 @@ int ip6_append_data(struct sock *sk,
|
|
|
* setup for corking
|
|
|
*/
|
|
|
err = ip6_setup_cork(sk, &inet->cork, &np->cork,
|
|
|
- ipc6, rt, fl6, sockc);
|
|
|
+ ipc6, rt, fl6);
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
@@ -1592,7 +1586,7 @@ int ip6_append_data(struct sock *sk,
|
|
|
|
|
|
return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork.base,
|
|
|
&np->cork, sk_page_frag(sk), getfrag,
|
|
|
- from, length, transhdrlen, flags, ipc6, sockc);
|
|
|
+ from, length, transhdrlen, flags, ipc6);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ip6_append_data);
|
|
|
|
|
@@ -1752,8 +1746,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)
|
|
|
+ struct inet_cork_full *cork)
|
|
|
{
|
|
|
struct inet6_cork v6_cork;
|
|
|
struct sk_buff_head queue;
|
|
@@ -1770,7 +1763,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
|
|
|
cork->base.opt = NULL;
|
|
|
cork->base.dst = NULL;
|
|
|
v6_cork.opt = NULL;
|
|
|
- err = ip6_setup_cork(sk, cork, &v6_cork, ipc6, rt, fl6, sockc);
|
|
|
+ err = ip6_setup_cork(sk, cork, &v6_cork, ipc6, rt, fl6);
|
|
|
if (err) {
|
|
|
ip6_cork_release(cork, &v6_cork);
|
|
|
return ERR_PTR(err);
|
|
@@ -1781,7 +1774,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
|
|
|
err = __ip6_append_data(sk, fl6, &queue, &cork->base, &v6_cork,
|
|
|
¤t->task_frag, getfrag, from,
|
|
|
length + exthdrlen, transhdrlen + exthdrlen,
|
|
|
- flags, ipc6, sockc);
|
|
|
+ flags, ipc6);
|
|
|
if (err) {
|
|
|
__ip6_flush_pending_frames(sk, &queue, cork, &v6_cork);
|
|
|
return ERR_PTR(err);
|