mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
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:
parent
d35c9659e5
commit
885c36e59f
6 changed files with 10 additions and 6 deletions
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -2057,7 +2057,7 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue