net: Re-use and set mono_delivery_time bit for userspace tstamp packets

Bridge driver today has no support to forward the userspace timestamp
packets and ends up resetting the timestamp. ETF qdisc checks the
packet coming from userspace and encounters to be 0 thereby dropping
time sensitive packets. These changes will allow userspace timestamps
packets to be forwarded from the bridge to NIC drivers.

Setting the same bit (mono_delivery_time) to avoid dropping of
userspace tstamp packets in the forwarding path.

Existing functionality of mono_delivery_time remains unaltered here,
instead just extended with userspace tstamp support for bridge
forwarding path.

Signed-off-by: Abhishek Chauhan <quic_abchauha@quicinc.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://lore.kernel.org/r/20240301201348.2815102-1-quic_abchauha@quicinc.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Abhishek Chauhan 2024-03-01 12:13:48 -08:00 committed by Paolo Abeni
parent d35c9659e5
commit 885c36e59f
6 changed files with 10 additions and 6 deletions

View File

@ -822,9 +822,9 @@ typedef unsigned char *sk_buff_data_t;
* @decrypted: Decrypted SKB * @decrypted: Decrypted SKB
* @slow_gro: state present at GRO time, slower prepare step required * @slow_gro: state present at GRO time, slower prepare step required
* @mono_delivery_time: When set, skb->tstamp has the * @mono_delivery_time: When set, skb->tstamp has the
* delivery_time in mono clock base (i.e. EDT). Otherwise, the * delivery_time in mono clock base (i.e., EDT) or a clock base chosen
* skb->tstamp has the (rcv) timestamp at ingress and * by SO_TXTIME. If zero, skb->tstamp has the (rcv) timestamp at
* delivery_time at egress. * ingress.
* @napi_id: id of the NAPI struct this skb came from * @napi_id: id of the NAPI struct this skb came from
* @sender_cpu: (aka @napi_id) source CPU in XPS * @sender_cpu: (aka @napi_id) source CPU in XPS
* @alloc_cpu: CPU which did the skb allocation. * @alloc_cpu: CPU which did the skb allocation.

View File

@ -1458,6 +1458,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
skb->priority = (cork->tos != -1) ? cork->priority: READ_ONCE(sk->sk_priority); skb->priority = (cork->tos != -1) ? cork->priority: READ_ONCE(sk->sk_priority);
skb->mark = cork->mark; skb->mark = cork->mark;
skb->tstamp = cork->transmit_time; skb->tstamp = cork->transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
/* /*
* Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec * Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec
* on dst refcount * on dst refcount

View File

@ -353,6 +353,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
skb->priority = READ_ONCE(sk->sk_priority); skb->priority = READ_ONCE(sk->sk_priority);
skb->mark = sockc->mark; skb->mark = sockc->mark;
skb->tstamp = sockc->transmit_time; skb->tstamp = sockc->transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
skb_dst_set(skb, &rt->dst); skb_dst_set(skb, &rt->dst);
*rtp = NULL; *rtp = NULL;

View File

@ -1925,7 +1925,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
skb->priority = READ_ONCE(sk->sk_priority); skb->priority = READ_ONCE(sk->sk_priority);
skb->mark = cork->base.mark; skb->mark = cork->base.mark;
skb->tstamp = cork->base.transmit_time; skb->tstamp = cork->base.transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
ip6_cork_steal_dst(skb, cork); ip6_cork_steal_dst(skb, cork);
IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS); IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS);
if (proto == IPPROTO_ICMPV6) { if (proto == IPPROTO_ICMPV6) {

View File

@ -615,7 +615,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
skb->priority = READ_ONCE(sk->sk_priority); skb->priority = READ_ONCE(sk->sk_priority);
skb->mark = sockc->mark; skb->mark = sockc->mark;
skb->tstamp = sockc->transmit_time; skb->tstamp = sockc->transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
skb_put(skb, length); skb_put(skb, length);
skb_reset_network_header(skb); skb_reset_network_header(skb);
iph = ipv6_hdr(skb); iph = ipv6_hdr(skb);

View File

@ -2057,7 +2057,7 @@ retry:
skb->priority = READ_ONCE(sk->sk_priority); skb->priority = READ_ONCE(sk->sk_priority);
skb->mark = READ_ONCE(sk->sk_mark); skb->mark = READ_ONCE(sk->sk_mark);
skb->tstamp = sockc.transmit_time; skb->tstamp = sockc.transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
skb_setup_tx_timestamp(skb, sockc.tsflags); skb_setup_tx_timestamp(skb, sockc.tsflags);
if (unlikely(extra_len == 4)) if (unlikely(extra_len == 4))
@ -2586,6 +2586,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
skb->priority = READ_ONCE(po->sk.sk_priority); skb->priority = READ_ONCE(po->sk.sk_priority);
skb->mark = READ_ONCE(po->sk.sk_mark); skb->mark = READ_ONCE(po->sk.sk_mark);
skb->tstamp = sockc->transmit_time; skb->tstamp = sockc->transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
skb_setup_tx_timestamp(skb, sockc->tsflags); skb_setup_tx_timestamp(skb, sockc->tsflags);
skb_zcopy_set_nouarg(skb, ph.raw); skb_zcopy_set_nouarg(skb, ph.raw);
@ -3064,6 +3065,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
skb->priority = READ_ONCE(sk->sk_priority); skb->priority = READ_ONCE(sk->sk_priority);
skb->mark = sockc.mark; skb->mark = sockc.mark;
skb->tstamp = sockc.transmit_time; skb->tstamp = sockc.transmit_time;
skb->mono_delivery_time = !!skb->tstamp;
if (unlikely(extra_len == 4)) if (unlikely(extra_len == 4))
skb->no_fcs = 1; skb->no_fcs = 1;