Pull networking fixes from Jakub Kicinski: "Networking fixes for 5.12-rc7, including fixes from can, ipsec, mac80211, wireless, and bpf trees. No scary regressions here or in the works, but small fixes for 5.12 changes keep coming. Current release - regressions: - virtio: do not pull payload in skb->head - virtio: ensure mac header is set in virtio_net_hdr_to_skb() - Revert "net: correct sk_acceptq_is_full()" - mptcp: revert "mptcp: provide subflow aware release function" - ethernet: lan743x: fix ethernet frame cutoff issue - dsa: fix type was not set for devlink port - ethtool: remove link_mode param and derive link params from driver - sched: htb: fix null pointer dereference on a null new_q - wireless: iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd() - wireless: iwlwifi: fw: fix notification wait locking - wireless: brcmfmac: p2p: Fix deadlock introduced by avoiding the rtnl dependency Current release - new code bugs: - napi: fix hangup on napi_disable for threaded napi - bpf: take module reference for trampoline in module - wireless: mt76: mt7921: fix airtime reporting and related tx hangs - wireless: iwlwifi: mvm: rfi: don't lock mvm->mutex when sending config command Previous releases - regressions: - rfkill: revert back to old userspace API by default - nfc: fix infinite loop, refcount & memory leaks in LLCP sockets - let skb_orphan_partial wake-up waiters - xfrm/compat: Cleanup WARN()s that can be user-triggered - vxlan, geneve: do not modify the shared tunnel info when PMTU triggers an ICMP reply - can: fix msg_namelen values depending on CAN_REQUIRED_SIZE - can: uapi: mark union inside struct can_frame packed - sched: cls: fix action overwrite reference counting - sched: cls: fix err handler in tcf_action_init() - ethernet: mlxsw: fix ECN marking in tunnel decapsulation - ethernet: nfp: Fix a use after free in nfp_bpf_ctrl_msg_rx - ethernet: i40e: fix receiving of single packets in xsk zero-copy mode - ethernet: cxgb4: avoid collecting SGE_QBASE regs during traffic Previous releases - always broken: - bpf: Refuse non-O_RDWR flags in BPF_OBJ_GET - bpf: Refcount task stack in bpf_get_task_stack - bpf, x86: Validate computation of branch displacements - ieee802154: fix many similar syzbot-found bugs - fix NULL dereferences in netlink attribute handling - reject unsupported operations on monitor interfaces - fix error handling in llsec_key_alloc() - xfrm: make ipv4 pmtu check honor ip header df - xfrm: make hash generation lock per network namespace - xfrm: esp: delete NETIF_F_SCTP_CRC bit from features for esp offload - ethtool: fix incorrect datatype in set_eee ops - xdp: fix xdp_return_frame() kernel BUG throw for page_pool memory model - openvswitch: fix send of uninitialized stack memory in ct limit reply Misc: - udp: add get handling for UDP_GRO sockopt" * tag 'net-5.12-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (182 commits) net: fix hangup on napi_disable for threaded napi net: hns3: Trivial spell fix in hns3 driver lan743x: fix ethernet frame cutoff issue net: ipv6: check for validity before dereferencing cfg->fc_nlinfo.nlh net: dsa: lantiq_gswip: Configure all remaining GSWIP_MII_CFG bits net: dsa: lantiq_gswip: Don't use PHY auto polling net: sched: sch_teql: fix null-pointer dereference ipv6: report errors for iftoken via netlink extack net: sched: fix err handler in tcf_action_init() net: sched: fix action overwrite reference counting Revert "net: sched: bump refcount for new action in ACT replace mode" ice: fix memory leak of aRFS after resuming from suspend i40e: Fix sparse warning: missing error code 'err' i40e: Fix sparse error: 'vsi->netdev' could be null i40e: Fix sparse error: uninitialized symbol 'ring' i40e: Fix sparse errors in i40e_txrx.c i40e: Fix parameters in aq_get_phy_register() nl80211: fix beacon head validation bpf, x86: Validate computation of branch displacements for x86-32 bpf, x86: Validate computation of branch displacements for x86-64 ...
Showing the changes to include/uapi/linux (3 of 179 files). Show all
Unified · Split
| @@ -113,7 +113,7 @@ struct can_frame { · 112 unmodified lines | |||
| 113 | */ | 113 | */ |
| 114 | __u8 len; | 114 | __u8 len; |
| 115 | __u8 can_dlc; /* deprecated */ | 115 | __u8 can_dlc; /* deprecated */ |
| 116 | }; | 116 | } __attribute__((packed)); /* disable padding added in some ABIs */ |
| 117 | __u8 __pad; /* padding */ | 117 | __u8 __pad; /* padding */ |
| 118 | __u8 __res0; /* reserved / padding */ | 118 | __u8 __res0; /* reserved / padding */ |
| 119 | __u8 len8_dlc; /* optional DLC for 8 byte payload length (9 .. 15) */ | 119 | __u8 len8_dlc; /* optional DLC for 8 byte payload length (9 .. 15) */ |
| @@ -26,6 +26,14 @@ · 25 unmodified lines | |||
| 26 | * have the same layout for 32-bit and 64-bit userland. | 26 | * have the same layout for 32-bit and 64-bit userland. |
| 27 | */ | 27 | */ |
| 28 | 28 | ||
| 29 | /* Note on reserved space. | ||
| 30 | * Reserved fields must not be accessed directly by user space because | ||
| 31 | * they may be replaced by a different field in the future. They must | ||
| 32 | * be initialized to zero before making the request, e.g. via memset | ||
| 33 | * of the entire structure or implicitly by not being set in a structure | ||
| 34 | * initializer. | ||
| 35 | */ | ||
| 36 | |||
| 29 | /** | 37 | /** |
| 30 | * struct ethtool_cmd - DEPRECATED, link control and status | 38 | * struct ethtool_cmd - DEPRECATED, link control and status |
| 31 | * This structure is DEPRECATED, please use struct ethtool_link_settings. | 39 | * This structure is DEPRECATED, please use struct ethtool_link_settings. |
| @@ -67,6 +75,7 @@ · 35 unmodified lines | |||
| 67 | * and other link features that the link partner advertised | 75 | * and other link features that the link partner advertised |
| 68 | * through autonegotiation; 0 if unknown or not applicable. | 76 | * through autonegotiation; 0 if unknown or not applicable. |
| 69 | * Read-only. | 77 | * Read-only. |
| 78 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 70 | * | 79 | * |
| 71 | * The link speed in Mbps is split between @speed and @speed_hi. Use | 80 | * The link speed in Mbps is split between @speed and @speed_hi. Use |
| 72 | * the ethtool_cmd_speed() and ethtool_cmd_speed_set() functions to | 81 | * the ethtool_cmd_speed() and ethtool_cmd_speed_set() functions to |
| @@ -155,6 +164,7 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep) · 82 unmodified lines | |||
| 155 | * @bus_info: Device bus address. This should match the dev_name() | 164 | * @bus_info: Device bus address. This should match the dev_name() |
| 156 | * string for the underlying bus device, if there is one. May be | 165 | * string for the underlying bus device, if there is one. May be |
| 157 | * an empty string. | 166 | * an empty string. |
| 167 | * @reserved2: Reserved for future use; see the note on reserved space. | ||
| 158 | * @n_priv_flags: Number of flags valid for %ETHTOOL_GPFLAGS and | 168 | * @n_priv_flags: Number of flags valid for %ETHTOOL_GPFLAGS and |
| 159 | * %ETHTOOL_SPFLAGS commands; also the number of strings in the | 169 | * %ETHTOOL_SPFLAGS commands; also the number of strings in the |
| 160 | * %ETH_SS_PRIV_FLAGS set | 170 | * %ETH_SS_PRIV_FLAGS set |
| @@ -356,6 +366,7 @@ struct ethtool_eeprom { · 195 unmodified lines | |||
| 356 | * @tx_lpi_timer: Time in microseconds the interface delays prior to asserting | 366 | * @tx_lpi_timer: Time in microseconds the interface delays prior to asserting |
| 357 | * its tx lpi (after reaching 'idle' state). Effective only when eee | 367 | * its tx lpi (after reaching 'idle' state). Effective only when eee |
| 358 | * was negotiated and tx_lpi_enabled was set. | 368 | * was negotiated and tx_lpi_enabled was set. |
| 369 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 359 | */ | 370 | */ |
| 360 | struct ethtool_eee { | 371 | struct ethtool_eee { |
| 361 | __u32 cmd; | 372 | __u32 cmd; |
| @@ -374,6 +385,7 @@ struct ethtool_eee { · 12 unmodified lines | |||
| 374 | * @cmd: %ETHTOOL_GMODULEINFO | 385 | * @cmd: %ETHTOOL_GMODULEINFO |
| 375 | * @type: Standard the module information conforms to %ETH_MODULE_SFF_xxxx | 386 | * @type: Standard the module information conforms to %ETH_MODULE_SFF_xxxx |
| 376 | * @eeprom_len: Length of the eeprom | 387 | * @eeprom_len: Length of the eeprom |
| 388 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 377 | * | 389 | * |
| 378 | * This structure is used to return the information to | 390 | * This structure is used to return the information to |
| 379 | * properly size memory for a subsequent call to %ETHTOOL_GMODULEEEPROM. | 391 | * properly size memory for a subsequent call to %ETHTOOL_GMODULEEEPROM. |
| @@ -579,9 +591,7 @@ struct ethtool_pauseparam { · 199 unmodified lines | |||
| 579 | __u32 tx_pause; | 591 | __u32 tx_pause; |
| 580 | }; | 592 | }; |
| 581 | 593 | ||
| 582 | /** | 594 | /* Link extended state */ |
| 583 | * enum ethtool_link_ext_state - link extended state | ||
| 584 | */ | ||
| 585 | enum ethtool_link_ext_state { | 595 | enum ethtool_link_ext_state { |
| 586 | ETHTOOL_LINK_EXT_STATE_AUTONEG, | 596 | ETHTOOL_LINK_EXT_STATE_AUTONEG, |
| 587 | ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE, | 597 | ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE, |
| @@ -595,10 +605,7 @@ enum ethtool_link_ext_state { · 7 unmodified lines | |||
| 595 | ETHTOOL_LINK_EXT_STATE_OVERHEAT, | 605 | ETHTOOL_LINK_EXT_STATE_OVERHEAT, |
| 596 | }; | 606 | }; |
| 597 | 607 | ||
| 598 | /** | 608 | /* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */ |
| 599 | * enum ethtool_link_ext_substate_autoneg - more information in addition to | ||
| 600 | * ETHTOOL_LINK_EXT_STATE_AUTONEG. | ||
| 601 | */ | ||
| 602 | enum ethtool_link_ext_substate_autoneg { | 609 | enum ethtool_link_ext_substate_autoneg { |
| 603 | ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, | 610 | ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, |
| 604 | ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED, | 611 | ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED, |
| @@ -608,9 +615,7 @@ enum ethtool_link_ext_substate_autoneg { · 3 unmodified lines | |||
| 608 | ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD, | 615 | ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD, |
| 609 | }; | 616 | }; |
| 610 | 617 | ||
| 611 | /** | 618 | /* More information in addition to ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE. |
| 612 | * enum ethtool_link_ext_substate_link_training - more information in addition to | ||
| 613 | * ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE. | ||
| 614 | */ | 619 | */ |
| 615 | enum ethtool_link_ext_substate_link_training { | 620 | enum ethtool_link_ext_substate_link_training { |
| 616 | ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, | 621 | ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, |
| @@ -619,9 +624,7 @@ enum ethtool_link_ext_substate_link_training { · 2 unmodified lines | |||
| 619 | ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT, | 624 | ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT, |
| 620 | }; | 625 | }; |
| 621 | 626 | ||
| 622 | /** | 627 | /* More information in addition to ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH. |
| 623 | * enum ethtool_link_ext_substate_logical_mismatch - more information in addition | ||
| 624 | * to ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH. | ||
| 625 | */ | 628 | */ |
| 626 | enum ethtool_link_ext_substate_link_logical_mismatch { | 629 | enum ethtool_link_ext_substate_link_logical_mismatch { |
| 627 | ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, | 630 | ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, |
| @@ -631,19 +634,14 @@ enum ethtool_link_ext_substate_link_logical_mismatch { · 3 unmodified lines | |||
| 631 | ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED, | 634 | ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED, |
| 632 | }; | 635 | }; |
| 633 | 636 | ||
| 634 | /** | 637 | /* More information in addition to ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY. |
| 635 | * enum ethtool_link_ext_substate_bad_signal_integrity - more information in | ||
| 636 | * addition to ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY. | ||
| 637 | */ | 638 | */ |
| 638 | enum ethtool_link_ext_substate_bad_signal_integrity { | 639 | enum ethtool_link_ext_substate_bad_signal_integrity { |
| 639 | ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, | 640 | ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, |
| 640 | ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE, | 641 | ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE, |
| 641 | }; | 642 | }; |
| 642 | 643 | ||
| 643 | /** | 644 | /* More information in addition to ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE. */ |
| 644 | * enum ethtool_link_ext_substate_cable_issue - more information in | ||
| 645 | * addition to ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE. | ||
| 646 | */ | ||
| 647 | enum ethtool_link_ext_substate_cable_issue { | 645 | enum ethtool_link_ext_substate_cable_issue { |
| 648 | ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, | 646 | ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, |
| 649 | ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE, | 647 | ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE, |
| @@ -661,6 +659,7 @@ enum ethtool_link_ext_substate_cable_issue { · 11 unmodified lines | |||
| 661 | * now deprecated | 659 | * now deprecated |
| 662 | * @ETH_SS_FEATURES: Device feature names | 660 | * @ETH_SS_FEATURES: Device feature names |
| 663 | * @ETH_SS_RSS_HASH_FUNCS: RSS hush function names | 661 | * @ETH_SS_RSS_HASH_FUNCS: RSS hush function names |
| 662 | * @ETH_SS_TUNABLES: tunable names | ||
| 664 | * @ETH_SS_PHY_STATS: Statistic names, for use with %ETHTOOL_GPHYSTATS | 663 | * @ETH_SS_PHY_STATS: Statistic names, for use with %ETHTOOL_GPHYSTATS |
| 665 | * @ETH_SS_PHY_TUNABLES: PHY tunable names | 664 | * @ETH_SS_PHY_TUNABLES: PHY tunable names |
| 666 | * @ETH_SS_LINK_MODES: link mode names | 665 | * @ETH_SS_LINK_MODES: link mode names |
| @@ -670,6 +669,8 @@ enum ethtool_link_ext_substate_cable_issue { · 3 unmodified lines | |||
| 670 | * @ETH_SS_TS_TX_TYPES: timestamping Tx types | 669 | * @ETH_SS_TS_TX_TYPES: timestamping Tx types |
| 671 | * @ETH_SS_TS_RX_FILTERS: timestamping Rx filters | 670 | * @ETH_SS_TS_RX_FILTERS: timestamping Rx filters |
| 672 | * @ETH_SS_UDP_TUNNEL_TYPES: UDP tunnel types | 671 | * @ETH_SS_UDP_TUNNEL_TYPES: UDP tunnel types |
| 672 | * | ||
| 673 | * @ETH_SS_COUNT: number of defined string sets | ||
| 673 | */ | 674 | */ |
| 674 | enum ethtool_stringset { | 675 | enum ethtool_stringset { |
| 675 | ETH_SS_TEST = 0, | 676 | ETH_SS_TEST = 0, |
| @@ -715,6 +716,7 @@ struct ethtool_gstrings { · 39 unmodified lines | |||
| 715 | /** | 716 | /** |
| 716 | * struct ethtool_sset_info - string set information | 717 | * struct ethtool_sset_info - string set information |
| 717 | * @cmd: Command number = %ETHTOOL_GSSET_INFO | 718 | * @cmd: Command number = %ETHTOOL_GSSET_INFO |
| 719 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 718 | * @sset_mask: On entry, a bitmask of string sets to query, with bits | 720 | * @sset_mask: On entry, a bitmask of string sets to query, with bits |
| 719 | * numbered according to &enum ethtool_stringset. On return, a | 721 | * numbered according to &enum ethtool_stringset. On return, a |
| 720 | * bitmask of those string sets queried that are supported. | 722 | * bitmask of those string sets queried that are supported. |
| @@ -759,6 +761,7 @@ enum ethtool_test_flags { · 38 unmodified lines | |||
| 759 | * @flags: A bitmask of flags from &enum ethtool_test_flags. Some | 761 | * @flags: A bitmask of flags from &enum ethtool_test_flags. Some |
| 760 | * flags may be set by the user on entry; others may be set by | 762 | * flags may be set by the user on entry; others may be set by |
| 761 | * the driver on return. | 763 | * the driver on return. |
| 764 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 762 | * @len: On return, the number of test results | 765 | * @len: On return, the number of test results |
| 763 | * @data: Array of test results | 766 | * @data: Array of test results |
| 764 | * | 767 | * |
| @@ -959,6 +962,7 @@ union ethtool_flow_union { · 194 unmodified lines | |||
| 959 | * @vlan_etype: VLAN EtherType | 962 | * @vlan_etype: VLAN EtherType |
| 960 | * @vlan_tci: VLAN tag control information | 963 | * @vlan_tci: VLAN tag control information |
| 961 | * @data: user defined data | 964 | * @data: user defined data |
| 965 | * @padding: Reserved for future use; see the note on reserved space. | ||
| 962 | * | 966 | * |
| 963 | * Note, @vlan_etype, @vlan_tci, and @data are only valid if %FLOW_EXT | 967 | * Note, @vlan_etype, @vlan_tci, and @data are only valid if %FLOW_EXT |
| 964 | * is set in &struct ethtool_rx_flow_spec @flow_type. | 968 | * is set in &struct ethtool_rx_flow_spec @flow_type. |
| @@ -1134,7 +1138,8 @@ struct ethtool_rxfh_indir { · 169 unmodified lines | |||
| 1134 | * hardware hash key. | 1138 | * hardware hash key. |
| 1135 | * @hfunc: Defines the current RSS hash function used by HW (or to be set to). | 1139 | * @hfunc: Defines the current RSS hash function used by HW (or to be set to). |
| 1136 | * Valid values are one of the %ETH_RSS_HASH_*. | 1140 | * Valid values are one of the %ETH_RSS_HASH_*. |
| 1137 | * @rsvd: Reserved for future extensions. | 1141 | * @rsvd8: Reserved for future use; see the note on reserved space. |
| 1142 | * @rsvd32: Reserved for future use; see the note on reserved space. | ||
| 1138 | * @rss_config: RX ring/queue index for each hash value i.e., indirection table | 1143 | * @rss_config: RX ring/queue index for each hash value i.e., indirection table |
| 1139 | * of @indir_size __u32 elements, followed by hash key of @key_size | 1144 | * of @indir_size __u32 elements, followed by hash key of @key_size |
| 1140 | * bytes. | 1145 | * bytes. |
| @@ -1302,7 +1307,9 @@ struct ethtool_sfeatures { · 161 unmodified lines | |||
| 1302 | * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags | 1307 | * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags |
| 1303 | * @phc_index: device index of the associated PHC, or -1 if there is none | 1308 | * @phc_index: device index of the associated PHC, or -1 if there is none |
| 1304 | * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values | 1309 | * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values |
| 1310 | * @tx_reserved: Reserved for future use; see the note on reserved space. | ||
| 1305 | * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values | 1311 | * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values |
| 1312 | * @rx_reserved: Reserved for future use; see the note on reserved space. | ||
| 1306 | * | 1313 | * |
| 1307 | * The bits in the 'tx_types' and 'rx_filters' fields correspond to | 1314 | * The bits in the 'tx_types' and 'rx_filters' fields correspond to |
| 1308 | * the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values, | 1315 | * the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values, |
| @@ -1958,6 +1965,11 @@ enum ethtool_reset_flags { · 649 unmodified lines | |||
| 1958 | * autonegotiation; 0 if unknown or not applicable. Read-only. | 1965 | * autonegotiation; 0 if unknown or not applicable. Read-only. |
| 1959 | * @transceiver: Used to distinguish different possible PHY types, | 1966 | * @transceiver: Used to distinguish different possible PHY types, |
| 1960 | * reported consistently by PHYLIB. Read-only. | 1967 | * reported consistently by PHYLIB. Read-only. |
| 1968 | * @master_slave_cfg: Master/slave port mode. | ||
| 1969 | * @master_slave_state: Master/slave port state. | ||
| 1970 | * @reserved: Reserved for future use; see the note on reserved space. | ||
| 1971 | * @reserved1: Reserved for future use; see the note on reserved space. | ||
| 1972 | * @link_mode_masks: Variable length bitmaps. | ||
| 1961 | * | 1973 | * |
| 1962 | * If autonegotiation is disabled, the speed and @duplex represent the | 1974 | * If autonegotiation is disabled, the speed and @duplex represent the |
| 1963 | * fixed link mode and are writable if the driver supports multiple | 1975 | * fixed link mode and are writable if the driver supports multiple |
| @@ -86,34 +86,90 @@ enum rfkill_hard_block_reasons { · 85 unmodified lines | |||
| 86 | * @op: operation code | 86 | * @op: operation code |
| 87 | * @hard: hard state (0/1) | 87 | * @hard: hard state (0/1) |
| 88 | * @soft: soft state (0/1) | 88 | * @soft: soft state (0/1) |
| 89 | * | ||
| 90 | * Structure used for userspace communication on /dev/rfkill, | ||
| 91 | * used for events from the kernel and control to the kernel. | ||
| 92 | */ | ||
| 93 | struct rfkill_event { | ||
| 94 | __u32 idx; | ||
| 95 | __u8 type; | ||
| 96 | __u8 op; | ||
| 97 | __u8 soft; | ||
| 98 | __u8 hard; | ||
| 99 | } __attribute__((packed)); | ||
| 100 | |||
| 101 | /** | ||
| 102 | * struct rfkill_event_ext - events for userspace on /dev/rfkill | ||
| 103 | * @idx: index of dev rfkill | ||
| 104 | * @type: type of the rfkill struct | ||
| 105 | * @op: operation code | ||
| 106 | * @hard: hard state (0/1) | ||
| 107 | * @soft: soft state (0/1) | ||
| 89 | * @hard_block_reasons: valid if hard is set. One or several reasons from | 108 | * @hard_block_reasons: valid if hard is set. One or several reasons from |
| 90 | * &enum rfkill_hard_block_reasons. | 109 | * &enum rfkill_hard_block_reasons. |
| 91 | * | 110 | * |
| 92 | * Structure used for userspace communication on /dev/rfkill, | 111 | * Structure used for userspace communication on /dev/rfkill, |
| 93 | * used for events from the kernel and control to the kernel. | 112 | * used for events from the kernel and control to the kernel. |
| 113 | * | ||
| 114 | * See the extensibility docs below. | ||
| 94 | */ | 115 | */ |
| 95 | struct rfkill_event { | 116 | struct rfkill_event_ext { |
| 96 | __u32 idx; | 117 | __u32 idx; |
| 97 | __u8 type; | 118 | __u8 type; |
| 98 | __u8 op; | 119 | __u8 op; |
| 99 | __u8 soft; | 120 | __u8 soft; |
| 100 | __u8 hard; | 121 | __u8 hard; |
| 122 | |||
| 123 | /* | ||
| 124 | * older kernels will accept/send only up to this point, | ||
| 125 | * and if extended further up to any chunk marked below | ||
| 126 | */ | ||
| 127 | |||
| 101 | __u8 hard_block_reasons; | 128 | __u8 hard_block_reasons; |
| 102 | } __attribute__((packed)); | 129 | } __attribute__((packed)); |
| 103 | 130 | ||
| 104 | /* | 131 | /** |
| 105 | * We are planning to be backward and forward compatible with changes | 132 | * DOC: Extensibility |
| 106 | * to the event struct, by adding new, optional, members at the end. | 133 | * |
| 107 | * When reading an event (whether the kernel from userspace or vice | 134 | * Originally, we had planned to allow backward and forward compatible |
| 108 | * versa) we need to accept anything that's at least as large as the | 135 | * changes by just adding fields at the end of the structure that are |
| 109 | * version 1 event size, but might be able to accept other sizes in | 136 | * then not reported on older kernels on read(), and not written to by |
| 110 | * the future. | 137 | * older kernels on write(), with the kernel reporting the size it did |
| 138 | * accept as the result. | ||
| 139 | * | ||
| 140 | * This would have allowed userspace to detect on read() and write() | ||
| 141 | * which kernel structure version it was dealing with, and if was just | ||
| 142 | * recompiled it would have gotten the new fields, but obviously not | ||
| 143 | * accessed them, but things should've continued to work. | ||
| 144 | * | ||
| 145 | * Unfortunately, while actually exercising this mechanism to add the | ||
| 146 | * hard block reasons field, we found that userspace (notably systemd) | ||
| 147 | * did all kinds of fun things not in line with this scheme: | ||
| 148 | * | ||
| 149 | * 1. treat the (expected) short writes as an error; | ||
| 150 | * 2. ask to read sizeof(struct rfkill_event) but then compare the | ||
| 151 | * actual return value to RFKILL_EVENT_SIZE_V1 and treat any | ||
| 152 | * mismatch as an error. | ||
| 153 | * | ||
| 154 | * As a consequence, just recompiling with a new struct version caused | ||
| 155 | * things to no longer work correctly on old and new kernels. | ||
| 156 | * | ||
| 157 | * Hence, we've rolled back &struct rfkill_event to the original version | ||
| 158 | * and added &struct rfkill_event_ext. This effectively reverts to the | ||
| 159 | * old behaviour for all userspace, unless it explicitly opts in to the | ||
| 160 | * rules outlined here by using the new &struct rfkill_event_ext. | ||
| 161 | * | ||
| 162 | * Userspace using &struct rfkill_event_ext must adhere to the following | ||
| 163 | * rules | ||
| 111 | * | 164 | * |
| 112 | * One exception is the kernel -- we already have two event sizes in | 165 | * 1. accept short writes, optionally using them to detect that it's |
| 113 | * that we've made the 'hard' member optional since our only option | 166 | * running on an older kernel; |
| 114 | * is to ignore it anyway. | 167 | * 2. accept short reads, knowing that this means it's running on an |
| 168 | * older kernel; | ||
| 169 | * 3. treat reads that are as long as requested as acceptable, not | ||
| 170 | * checking against RFKILL_EVENT_SIZE_V1 or such. | ||
| 115 | */ | 171 | */ |
| 116 | #define RFKILL_EVENT_SIZE_V1 8 | 172 | #define RFKILL_EVENT_SIZE_V1 sizeof(struct rfkill_event) |
| 117 | 173 | ||
| 118 | /* ioctl for turning off rfkill-input (if present) */ | 174 | /* ioctl for turning off rfkill-input (if present) */ |
| 119 | #define RFKILL_IOC_MAGIC 'R' | 175 | #define RFKILL_IOC_MAGIC 'R' |