Messages in this thread | | | Date | Wed, 11 May 2022 14:38:32 +0200 | Subject | Re: [PATCH 1/1] can: skb: add and set local_origin flag | From | Oliver Hartkopp <> |
| |
Hi Oleksij,
On 5/11/22 14:19, Oleksij Rempel wrote: > Add new can_skb_priv::local_origin flag to be able detect egress > packages even if they was sent directly from kernel and not assigned to > some socket. > > Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> > Cc: Devid Antonio Filoni <devid.filoni@egluetechnologies.com> > --- > drivers/net/can/dev/skb.c | 3 +++ > include/linux/can/skb.h | 1 + > net/can/raw.c | 2 +- > 3 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c > index 61660248c69e..3e2357fb387e 100644 > --- a/drivers/net/can/dev/skb.c > +++ b/drivers/net/can/dev/skb.c > @@ -63,6 +63,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, > > /* save frame_len to reuse it when transmission is completed */ > can_skb_prv(skb)->frame_len = frame_len; > + can_skb_prv(skb)->local_origin = true; > > skb_tx_timestamp(skb); > > @@ -200,6 +201,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) > can_skb_reserve(skb); > can_skb_prv(skb)->ifindex = dev->ifindex; > can_skb_prv(skb)->skbcnt = 0; > + can_skb_prv(skb)->local_origin = false; > > *cf = skb_put_zero(skb, sizeof(struct can_frame)); > > @@ -231,6 +233,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, > can_skb_reserve(skb); > can_skb_prv(skb)->ifindex = dev->ifindex; > can_skb_prv(skb)->skbcnt = 0; > + can_skb_prv(skb)->local_origin = false;
IMO this patch does not work as intended.
You probably need to revisit every place where can_skb_reserve() is used, e.g. in raw_sendmsg().
E.g. to make it work for virtual CAN and vxcan interfaces.
I'm a bit unsure why we should not stick with the simple skb->sk handling?
Regards, Oliver
> > *cfd = skb_put_zero(skb, sizeof(struct canfd_frame)); > > diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h > index fdb22b00674a..1b8a8cf2b13b 100644 > --- a/include/linux/can/skb.h > +++ b/include/linux/can/skb.h > @@ -52,6 +52,7 @@ struct can_skb_priv { > int ifindex; > int skbcnt; > unsigned int frame_len; > + bool local_origin; > struct can_frame cf[]; > }; > > diff --git a/net/can/raw.c b/net/can/raw.c > index b7dbb57557f3..df2d9334b395 100644 > --- a/net/can/raw.c > +++ b/net/can/raw.c > @@ -173,7 +173,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) > /* add CAN specific message flags for raw_recvmsg() */ > pflags = raw_flags(skb); > *pflags = 0; > - if (oskb->sk) > + if (can_skb_prv(skb)->local_origin) > *pflags |= MSG_DONTROUTE; > if (oskb->sk == sk) > *pflags |= MSG_CONFIRM;
| |