diff options
| author | Marc Kleine-Budde <[email protected]> | 2022-06-11 17:11:34 +0200 |
|---|---|---|
| committer | Marc Kleine-Budde <[email protected]> | 2022-06-11 17:11:44 +0200 |
| commit | 6914df1891c27f83e538dab3f5aadd2842e89a7f (patch) | |
| tree | 4271015a286269a3c526c3b71e9d2855e6c3546b /include/linux | |
| parent | 7e193a42c37cf40eba8ac5af2d5e8eeb8b9506f9 (diff) | |
| parent | a6d190f8c7670068d8c154ef8477eca07b5e3574 (diff) | |
Merge branch 'can-refactoring-of-can-dev-module-and-of-Kbuild'
Vincent Mailhol says
====================
Aside of calc_bittiming.o which can be configured with
CAN_CALC_BITTIMING, all objects from drivers/net/can/dev/ get linked
unconditionally to can-dev.o even if not needed by the user.
This series first goal it to split the can-dev modules so that the
only the needed features get built in during compilation.
Additionally, the CAN Device Drivers menu is moved from the
"Networking support" category to the "Device Drivers" category (where
all drivers are supposed to be).
* menu before this series *
CAN bus subsystem support
symbol: CONFIG_CAN
|
+-> CAN Device Drivers
(no symbol)
|
+-> software/virtual CAN device drivers
| (at time of writing: slcan, vcan, vxcan)
|
+-> Platform CAN drivers with Netlink support
symbol: CONFIG_CAN_DEV
|
+-> CAN bit-timing calculation (optional for hardware drivers)
| symbol: CONFIG_CAN_CALC_BITTIMING
|
+-> All other CAN devices drivers
* menu after this series *
Network device support
symbol: CONFIG_NETDEVICES
|
+-> CAN Device Drivers
symbol: CONFIG_CAN_DEV
|
+-> software/virtual CAN device drivers
| (at time of writing: slcan, vcan, vxcan)
|
+-> CAN device drivers with Netlink support
symbol: CONFIG_CAN_NETLINK (matches previous CONFIG_CAN_DEV)
|
+-> CAN bit-timing calculation (optional for all drivers)
| symbol: CONFIG_CAN_CALC_BITTIMING
|
+-> All other CAN devices drivers
(some may select CONFIG_CAN_RX_OFFLOAD)
|
+-> CAN rx offload (automatically selected by some drivers)
(hidden symbol: CONFIG_CAN_RX_OFFLOAD)
Patches 1 to 5 of this series do above modification.
The last two patches add a check toward CAN_CTRLMODE_LISTENONLY in
can_dropped_invalid_skb() to discard tx skb (such skb can potentially
reach the driver if injected via the packet socket). In more details,
patch 6 moves can_dropped_invalid_skb() from skb.h to skb.o and patch
7 is the actual change.
Those last two patches are actually connected to the first five ones:
because slcan and v(x)can requires can_dropped_invalid_skb(), it was
necessary to add those three devices to the scope of can-dev before
moving the function to skb.o.
This design results from the lengthy discussion in [1].
[1] https://lore.kernel.org/linux-can/[email protected]/
** Changelog **
v5 -> v6:
* fix typo in patch #1's title: Kbuild -> Kconfig.
* make CONFIG_RX_CAN an hidden config symbol and modify the diagram
in the cover letter accordingly.
@Oliver, with CONFIG_CAN_RX_OFFLOAD now being an hidden config,
that option fully depends on the drivers. So contrary to your
suggestion, I put CONFIG_CAN_RX_OFFLOAD below the device drivers
in the diagram.
* fix typo in cover letter: CONFIG_CAN_BITTIMING -> CONFIG_CAN_CALC_BITTIMING.
v4 -> v5:
* m_can is also requires RX offload. Add the "select CAN_RX_OFFLOAD"
to its Makefile.
* Reorder the lines of drivers/net/can/dev/Makefile.
* Remove duplicated rx-offload.o target in drivers/net/can/dev/Makefile
* Remove the Nota Bene in the cover letter.
v3 -> v4:
* Five additional patches added to split can-dev module and refactor
Kbuild. c.f. below (lengthy) thread:
https://lore.kernel.org/linux-can/[email protected]/
v2 -> v3:
* Apply can_dropped_invalid_skb() to slcan.
* Make vcan, vxcan and slcan dependent of CONFIG_CAN_DEV by
modifying Kbuild.
* fix small typos.
v1 -> v2:
* move can_dropped_invalid_skb() to skb.c instead of dev.h
* also move can_skb_headroom_valid() to skb.c
====================
Link: https://lore.kernel.org/all/[email protected]
Signed-off-by: Marc Kleine-Budde <[email protected]>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/can/skb.h | 59 |
1 files changed, 1 insertions, 58 deletions
diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index fdb22b00674a..182749e858b3 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h @@ -31,6 +31,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, struct canfd_frame **cfd); struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf); +bool can_dropped_invalid_skb(struct net_device *dev, struct sk_buff *skb); /* * The struct can_skb_priv is used to transport additional information along @@ -96,64 +97,6 @@ static inline struct sk_buff *can_create_echo_skb(struct sk_buff *skb) return nskb; } -/* Check for outgoing skbs that have not been created by the CAN subsystem */ -static inline bool can_skb_headroom_valid(struct net_device *dev, - struct sk_buff *skb) -{ - /* af_packet creates a headroom of HH_DATA_MOD bytes which is fine */ - if (WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct can_skb_priv))) - return false; - - /* af_packet does not apply CAN skb specific settings */ - if (skb->ip_summed == CHECKSUM_NONE) { - /* init headroom */ - can_skb_prv(skb)->ifindex = dev->ifindex; - can_skb_prv(skb)->skbcnt = 0; - - skb->ip_summed = CHECKSUM_UNNECESSARY; - - /* perform proper loopback on capable devices */ - if (dev->flags & IFF_ECHO) - skb->pkt_type = PACKET_LOOPBACK; - else - skb->pkt_type = PACKET_HOST; - - skb_reset_mac_header(skb); - skb_reset_network_header(skb); - skb_reset_transport_header(skb); - } - - return true; -} - -/* Drop a given socketbuffer if it does not contain a valid CAN frame. */ -static inline bool can_dropped_invalid_skb(struct net_device *dev, - struct sk_buff *skb) -{ - const struct canfd_frame *cfd = (struct canfd_frame *)skb->data; - - if (skb->protocol == htons(ETH_P_CAN)) { - if (unlikely(skb->len != CAN_MTU || - cfd->len > CAN_MAX_DLEN)) - goto inval_skb; - } else if (skb->protocol == htons(ETH_P_CANFD)) { - if (unlikely(skb->len != CANFD_MTU || - cfd->len > CANFD_MAX_DLEN)) - goto inval_skb; - } else - goto inval_skb; - - if (!can_skb_headroom_valid(dev, skb)) - goto inval_skb; - - return false; - -inval_skb: - kfree_skb(skb); - dev->stats.tx_dropped++; - return true; -} - static inline bool can_is_canfd_skb(const struct sk_buff *skb) { /* the CAN specific type of skb is identified by its data length */ |