Re: [PATCH] can: bcm: add recvmsg flags for own, local and remote traffic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Nicolas,

thanks for the patch!

On 07.01.24 07:44, Nicolas Maier wrote:

@@ -642,7 +666,7 @@ static enum hrtimer_restart bcm_rx_thr_handler(struct hrtimer *hrtimer)
  static void bcm_rx_handler(struct sk_buff *skb, void *data)
  {
  	struct bcm_op *op = (struct bcm_op *)data;
-	const struct canfd_frame *rxframe = (struct canfd_frame *)skb->data;
+	struct canfd_frame *rxframe = (struct canfd_frame *)skb->data;
  	unsigned int i;
if (op->can_id != rxframe->can_id)
@@ -657,6 +681,13 @@ static void bcm_rx_handler(struct sk_buff *skb, void *data)
  			return;
  	}
+ /* add flags to distinguish between own/local/remote CAN traffic */
+	if (skb->sk) {
+		rxframe->flags |= RX_LOCAL;
+		if (skb->sk == op->sk)
+			rxframe->flags |= RX_OWN;
+	}
+
  	/* disable timeout */
  	hrtimer_cancel(&op->timer);

No. You are writing to a read-only skbuff, which is not yet cloned or copied. The read-only handling of the skb is done in the NET_RX_SOFTIRQ triggering can_rcv_filter() and friends.

See this note:

https://elixir.bootlin.com/linux/v6.7/source/net/can/af_can.c#L430

When you are also changing the CAN frames' content you need to skb_copy() the provided skb, see:

https://elixir.bootlin.com/linux/v6.7/source/net/can/gw.c#L504

So if you want to pass these new flags to the user space you should think of extending the parameter list of bcm_rx_update_and_send() and bcm_rx_cmp_to_index().

But in the first place I'm interested to know what the use-case for this extension is.

Best regards,
Oliver




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux