ip: remove tx_flags from ipcm_cookie and use same logic for v4 and v6
authorWillem de Bruijn <willemb@google.com>
Fri, 6 Jul 2018 14:12:58 +0000 (10:12 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 7 Jul 2018 01:58:49 +0000 (10:58 +0900)
skb_shinfo(skb)->tx_flags is derived from sk->sk_tsflags, possibly
after modification by __sock_cmsg_send, by calling sock_tx_timestamp.

The IPv4 and IPv6 paths do this conversion differently. In IPv4, the
individual protocols that support tx timestamps call this function
and store the result in ipc.tx_flags. In IPv6, sock_tx_timestamp is
called in __ip6_append_data.

There is no need to store both tx_flags and ts_flags in the cookie
as one is derived from the other. Convert when setting up the cork
and remove the redundant field. This is similar to IPv6, only have
the conversion happen only once per datagram, in ip(6)_setup_cork.

Also change __ip6_append_data to match __ip_append_data. Only update
tskey if timestamping is enabled with OPT_ID. The SOCK_.. test is
redundant: only valid protocols can have non-zero cork->tx_flags.

After this change the IPv4 and IPv6 logic is the same.

Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip.h
net/ipv4/ip_output.c
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv4/udp.c
net/ipv6/ip6_output.c

index 6db23bf1e5eb41866609720ce6ab6543d3282fb8..e44b1a44f67ad447528f1c59f05915157e016154 100644 (file)
@@ -72,7 +72,6 @@ struct ipcm_cookie {
        __be32                  addr;
        int                     oif;
        struct ip_options_rcu   *opt;
-       __u8                    tx_flags;
        __u8                    ttl;
        __s16                   tos;
        char                    priority;
index 81d0e4a77ec5965eea26a9cc8daf0660005049c3..e14c774cc092457483a945770668984f6236e2f6 100644 (file)
@@ -1153,8 +1153,9 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
        cork->ttl = ipc->ttl;
        cork->tos = ipc->tos;
        cork->priority = ipc->priority;
-       cork->tx_flags = ipc->tx_flags;
        cork->transmit_time = ipc->sockc.transmit_time;
+       cork->tx_flags = 0;
+       sock_tx_timestamp(sk, ipc->sockc.tsflags, &cork->tx_flags);
 
        return 0;
 }
index 6f17fc8ebbdb7c96ee8d605a1747ad8d3b7797b3..b54c964ad9256ca2c5ac7eff239366f2869588a9 100644 (file)
@@ -763,8 +763,6 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                rcu_read_unlock();
        }
 
-       sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
-
        saddr = ipc.addr;
        ipc.addr = faddr = daddr;
 
index cf142909389cd1d5317228ae7f26f47e5618e33b..33df4d76db2d948d620ffc809574b364ae24ad4b 100644 (file)
@@ -665,8 +665,6 @@ back_from_confirm:
                                      &rt, msg->msg_flags, &ipc.sockc);
 
         else {
-               sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
-
                if (!ipc.addr)
                        ipc.addr = fl4.daddr;
                lock_sock(sk);
index 87f3a0b77864e2a805232ede3683938882f928d2..060e841dde400fd1e1c02992fa448dc60305cec3 100644 (file)
@@ -1020,8 +1020,6 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        saddr = ipc.addr;
        ipc.addr = faddr = daddr;
 
-       sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
-
        if (ipc.opt && ipc.opt->opt.srr) {
                if (!daddr) {
                        err = -EINVAL;
index 1a3bf6437cb9edc08f4c4b3b6f27dcdb98e564c7..ff4b28a600abbda93559ad7f9438e941fdeebe6b 100644 (file)
@@ -1221,6 +1221,8 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
        cork->base.fragsize = mtu;
        cork->base.gso_size = sk->sk_type == SOCK_DGRAM &&
                              sk->sk_protocol == IPPROTO_UDP ? ipc6->gso_size : 0;
+       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;
@@ -1250,7 +1252,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;
@@ -1269,6 +1270,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 +
@@ -1318,13 +1323,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, ipc6->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.
@@ -1443,8 +1441,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;