diff options
-rw-r--r-- | include/uapi/linux/can/gw.h | 1 | ||||
-rw-r--r-- | net/can/gw.c | 8 |
2 files changed, 9 insertions, 0 deletions
diff --git a/include/uapi/linux/can/gw.h b/include/uapi/linux/can/gw.h index 8e1db18c3cb6..0505c7f86213 100644 --- a/include/uapi/linux/can/gw.h +++ b/include/uapi/linux/can/gw.h | |||
@@ -51,6 +51,7 @@ enum { | |||
51 | 51 | ||
52 | #define CGW_FLAGS_CAN_ECHO 0x01 | 52 | #define CGW_FLAGS_CAN_ECHO 0x01 |
53 | #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 | 53 | #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 |
54 | #define CGW_FLAGS_CAN_IIF_TX_OK 0x04 | ||
54 | 55 | ||
55 | #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ | 56 | #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ |
56 | 57 | ||
diff --git a/net/can/gw.c b/net/can/gw.c index 574dda78eb0f..37a3efb7cc9d 100644 --- a/net/can/gw.c +++ b/net/can/gw.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/skbuff.h> | 52 | #include <linux/skbuff.h> |
53 | #include <linux/can.h> | 53 | #include <linux/can.h> |
54 | #include <linux/can/core.h> | 54 | #include <linux/can/core.h> |
55 | #include <linux/can/skb.h> | ||
55 | #include <linux/can/gw.h> | 56 | #include <linux/can/gw.h> |
56 | #include <net/rtnetlink.h> | 57 | #include <net/rtnetlink.h> |
57 | #include <net/net_namespace.h> | 58 | #include <net/net_namespace.h> |
@@ -347,6 +348,13 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *data) | |||
347 | return; | 348 | return; |
348 | } | 349 | } |
349 | 350 | ||
351 | /* is sending the skb back to the incoming interface not allowed? */ | ||
352 | if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && | ||
353 | skb_headroom(skb) == sizeof(struct can_skb_priv) && | ||
354 | (((struct can_skb_priv *)(skb->head))->ifindex == | ||
355 | gwj->dst.dev->ifindex)) | ||
356 | return; | ||
357 | |||
350 | /* | 358 | /* |
351 | * clone the given skb, which has not been done in can_rcv() | 359 | * clone the given skb, which has not been done in can_rcv() |
352 | * | 360 | * |