mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
Merge Linus's 5.4-rc1-prerelease branch into android-mainline
This merges Linus's tree as of commit b41dae061b ("Merge tag
'xfs-5.4-merge-7' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux")
into android-mainline.
This "early" merge makes it easier to test and handle merge conflicts
instead of having to wait until the "end" of the merge window and handle
all 10000+ commits at once.
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I6bebf55e5e2353f814e3c87f5033607b1ae5d812
This commit is contained in:
commit
bfa0399bc8
7251 changed files with 334804 additions and 222478 deletions
|
|
@ -78,6 +78,8 @@ static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
|
|||
#define ACT_P_CREATED 1
|
||||
#define ACT_P_DELETED 1
|
||||
|
||||
typedef void (*tc_action_priv_destructor)(void *priv);
|
||||
|
||||
struct tc_action_ops {
|
||||
struct list_head head;
|
||||
char kind[IFNAMSIZ];
|
||||
|
|
@ -99,8 +101,11 @@ struct tc_action_ops {
|
|||
struct netlink_ext_ack *);
|
||||
void (*stats_update)(struct tc_action *, u64, u32, u64, bool);
|
||||
size_t (*get_fill_size)(const struct tc_action *act);
|
||||
struct net_device *(*get_dev)(const struct tc_action *a);
|
||||
void (*put_dev)(struct net_device *dev);
|
||||
struct net_device *(*get_dev)(const struct tc_action *a,
|
||||
tc_action_priv_destructor *destructor);
|
||||
struct psample_group *
|
||||
(*get_psample_group)(const struct tc_action *a,
|
||||
tc_action_priv_destructor *destructor);
|
||||
};
|
||||
|
||||
struct tc_action_net {
|
||||
|
|
|
|||
|
|
@ -1517,6 +1517,8 @@ void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c);
|
|||
#define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04
|
||||
#define DISCOV_BREDR_INQUIRY_LEN 0x08
|
||||
#define DISCOV_LE_RESTART_DELAY msecs_to_jiffies(200) /* msec */
|
||||
#define DISCOV_LE_FAST_ADV_INT_MIN 100 /* msec */
|
||||
#define DISCOV_LE_FAST_ADV_INT_MAX 150 /* msec */
|
||||
|
||||
void mgmt_fill_version_info(void *ver);
|
||||
int mgmt_new_settings(struct hci_dev *hdev);
|
||||
|
|
|
|||
|
|
@ -10,4 +10,14 @@ void bpf_sk_storage_free(struct sock *sk);
|
|||
extern const struct bpf_func_proto bpf_sk_storage_get_proto;
|
||||
extern const struct bpf_func_proto bpf_sk_storage_delete_proto;
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
int bpf_sk_storage_clone(const struct sock *sk, struct sock *newsk);
|
||||
#else
|
||||
static inline int bpf_sk_storage_clone(const struct sock *sk,
|
||||
struct sock *newsk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BPF_SK_STORAGE_H */
|
||||
|
|
|
|||
|
|
@ -246,6 +246,19 @@ struct ieee80211_rate {
|
|||
u16 hw_value, hw_value_short;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_he_obss_pd - AP settings for spatial reuse
|
||||
*
|
||||
* @enable: is the feature enabled.
|
||||
* @min_offset: minimal tx power offset an associated station shall use
|
||||
* @max_offset: maximum tx power offset an associated station shall use
|
||||
*/
|
||||
struct ieee80211_he_obss_pd {
|
||||
bool enable;
|
||||
u8 min_offset;
|
||||
u8 max_offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta_ht_cap - STA's HT capabilities
|
||||
*
|
||||
|
|
@ -317,6 +330,60 @@ struct ieee80211_sband_iftype_data {
|
|||
struct ieee80211_sta_he_cap he_cap;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_edmg_bw_config - allowed channel bandwidth configurations
|
||||
*
|
||||
* @IEEE80211_EDMG_BW_CONFIG_4: 2.16GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_5: 2.16GHz and 4.32GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_6: 2.16GHz, 4.32GHz and 6.48GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_7: 2.16GHz, 4.32GHz, 6.48GHz and 8.64GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_8: 2.16GHz and 2.16GHz + 2.16GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_9: 2.16GHz, 4.32GHz and 2.16GHz + 2.16GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_10: 2.16GHz, 4.32GHz, 6.48GHz and 2.16GHz+2.16GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_11: 2.16GHz, 4.32GHz, 6.48GHz, 8.64GHz and
|
||||
* 2.16GHz+2.16GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_12: 2.16GHz, 2.16GHz + 2.16GHz and
|
||||
* 4.32GHz + 4.32GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_13: 2.16GHz, 4.32GHz, 2.16GHz + 2.16GHz and
|
||||
* 4.32GHz + 4.32GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_14: 2.16GHz, 4.32GHz, 6.48GHz, 2.16GHz + 2.16GHz
|
||||
* and 4.32GHz + 4.32GHz
|
||||
* @IEEE80211_EDMG_BW_CONFIG_15: 2.16GHz, 4.32GHz, 6.48GHz, 8.64GHz,
|
||||
* 2.16GHz + 2.16GHz and 4.32GHz + 4.32GHz
|
||||
*/
|
||||
enum ieee80211_edmg_bw_config {
|
||||
IEEE80211_EDMG_BW_CONFIG_4 = 4,
|
||||
IEEE80211_EDMG_BW_CONFIG_5 = 5,
|
||||
IEEE80211_EDMG_BW_CONFIG_6 = 6,
|
||||
IEEE80211_EDMG_BW_CONFIG_7 = 7,
|
||||
IEEE80211_EDMG_BW_CONFIG_8 = 8,
|
||||
IEEE80211_EDMG_BW_CONFIG_9 = 9,
|
||||
IEEE80211_EDMG_BW_CONFIG_10 = 10,
|
||||
IEEE80211_EDMG_BW_CONFIG_11 = 11,
|
||||
IEEE80211_EDMG_BW_CONFIG_12 = 12,
|
||||
IEEE80211_EDMG_BW_CONFIG_13 = 13,
|
||||
IEEE80211_EDMG_BW_CONFIG_14 = 14,
|
||||
IEEE80211_EDMG_BW_CONFIG_15 = 15,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_edmg - EDMG configuration
|
||||
*
|
||||
* This structure describes most essential parameters needed
|
||||
* to describe 802.11ay EDMG configuration
|
||||
*
|
||||
* @channels: bitmap that indicates the 2.16 GHz channel(s)
|
||||
* that are allowed to be used for transmissions.
|
||||
* Bit 0 indicates channel 1, bit 1 indicates channel 2, etc.
|
||||
* Set to 0 indicate EDMG not supported.
|
||||
* @bw_config: Channel BW Configuration subfield encodes
|
||||
* the allowed channel bandwidth configurations
|
||||
*/
|
||||
struct ieee80211_edmg {
|
||||
u8 channels;
|
||||
enum ieee80211_edmg_bw_config bw_config;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_supported_band - frequency band definition
|
||||
*
|
||||
|
|
@ -333,6 +400,7 @@ struct ieee80211_sband_iftype_data {
|
|||
* @n_bitrates: Number of bitrates in @bitrates
|
||||
* @ht_cap: HT capabilities in this band
|
||||
* @vht_cap: VHT capabilities in this band
|
||||
* @edmg_cap: EDMG capabilities in this band
|
||||
* @n_iftype_data: number of iftype data entries
|
||||
* @iftype_data: interface type data entries. Note that the bits in
|
||||
* @types_mask inside this structure cannot overlap (i.e. only
|
||||
|
|
@ -347,6 +415,7 @@ struct ieee80211_supported_band {
|
|||
int n_bitrates;
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
struct ieee80211_sta_vht_cap vht_cap;
|
||||
struct ieee80211_edmg edmg_cap;
|
||||
u16 n_iftype_data;
|
||||
const struct ieee80211_sband_iftype_data *iftype_data;
|
||||
};
|
||||
|
|
@ -514,12 +583,17 @@ struct key_params {
|
|||
* @center_freq1: center frequency of first segment
|
||||
* @center_freq2: center frequency of second segment
|
||||
* (only with 80+80 MHz)
|
||||
* @edmg: define the EDMG channels configuration.
|
||||
* If edmg is requested (i.e. the .channels member is non-zero),
|
||||
* chan will define the primary channel and all other
|
||||
* parameters are ignored.
|
||||
*/
|
||||
struct cfg80211_chan_def {
|
||||
struct ieee80211_channel *chan;
|
||||
enum nl80211_chan_width width;
|
||||
u32 center_freq1;
|
||||
u32 center_freq2;
|
||||
struct ieee80211_edmg edmg;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -577,6 +651,19 @@ cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1,
|
|||
chandef1->center_freq2 == chandef2->center_freq2);
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_chandef_is_edmg - check if chandef represents an EDMG channel
|
||||
*
|
||||
* @chandef: the channel definition
|
||||
*
|
||||
* Return: %true if EDMG defined, %false otherwise.
|
||||
*/
|
||||
static inline bool
|
||||
cfg80211_chandef_is_edmg(const struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
return chandef->edmg.channels || chandef->edmg.bw_config;
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_chandef_compatible - check if two channel definitions are compatible
|
||||
* @chandef1: first channel definition
|
||||
|
|
@ -681,6 +768,7 @@ ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef)
|
|||
* @SURVEY_INFO_TIME_RX: receive time was filled in
|
||||
* @SURVEY_INFO_TIME_TX: transmit time was filled in
|
||||
* @SURVEY_INFO_TIME_SCAN: scan time was filled in
|
||||
* @SURVEY_INFO_TIME_BSS_RX: local BSS receive time was filled in
|
||||
*
|
||||
* Used by the driver to indicate which info in &struct survey_info
|
||||
* it has filled in during the get_survey().
|
||||
|
|
@ -694,6 +782,7 @@ enum survey_info_flags {
|
|||
SURVEY_INFO_TIME_RX = BIT(5),
|
||||
SURVEY_INFO_TIME_TX = BIT(6),
|
||||
SURVEY_INFO_TIME_SCAN = BIT(7),
|
||||
SURVEY_INFO_TIME_BSS_RX = BIT(8),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -710,6 +799,7 @@ enum survey_info_flags {
|
|||
* @time_rx: amount of time the radio spent receiving data
|
||||
* @time_tx: amount of time the radio spent transmitting data
|
||||
* @time_scan: amount of time the radio spent for scanning
|
||||
* @time_bss_rx: amount of time the radio spent receiving data on a local BSS
|
||||
*
|
||||
* Used by dump_survey() to report back per-channel survey information.
|
||||
*
|
||||
|
|
@ -724,6 +814,7 @@ struct survey_info {
|
|||
u64 time_rx;
|
||||
u64 time_tx;
|
||||
u64 time_scan;
|
||||
u64 time_bss_rx;
|
||||
u32 filled;
|
||||
s8 noise;
|
||||
};
|
||||
|
|
@ -896,6 +987,7 @@ enum cfg80211_ap_settings_flags {
|
|||
* @vht_required: stations must support VHT
|
||||
* @twt_responder: Enable Target Wait Time
|
||||
* @flags: flags, as defined in enum cfg80211_ap_settings_flags
|
||||
* @he_obss_pd: OBSS Packet Detection settings
|
||||
*/
|
||||
struct cfg80211_ap_settings {
|
||||
struct cfg80211_chan_def chandef;
|
||||
|
|
@ -923,6 +1015,7 @@ struct cfg80211_ap_settings {
|
|||
bool ht_required, vht_required;
|
||||
bool twt_responder;
|
||||
u32 flags;
|
||||
struct ieee80211_he_obss_pd he_obss_pd;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1162,15 +1255,17 @@ int cfg80211_check_station_change(struct wiphy *wiphy,
|
|||
* @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS
|
||||
* @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS
|
||||
* @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
|
||||
* @RATE_INFO_FLAGS_60G: 60GHz MCS
|
||||
* @RATE_INFO_FLAGS_DMG: 60GHz MCS
|
||||
* @RATE_INFO_FLAGS_HE_MCS: HE MCS information
|
||||
* @RATE_INFO_FLAGS_EDMG: 60GHz MCS in EDMG mode
|
||||
*/
|
||||
enum rate_info_flags {
|
||||
RATE_INFO_FLAGS_MCS = BIT(0),
|
||||
RATE_INFO_FLAGS_VHT_MCS = BIT(1),
|
||||
RATE_INFO_FLAGS_SHORT_GI = BIT(2),
|
||||
RATE_INFO_FLAGS_60G = BIT(3),
|
||||
RATE_INFO_FLAGS_DMG = BIT(3),
|
||||
RATE_INFO_FLAGS_HE_MCS = BIT(4),
|
||||
RATE_INFO_FLAGS_EDMG = BIT(5),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1210,6 +1305,7 @@ enum rate_info_bw {
|
|||
* @he_dcm: HE DCM value
|
||||
* @he_ru_alloc: HE RU allocation (from &enum nl80211_he_ru_alloc,
|
||||
* only valid if bw is %RATE_INFO_BW_HE_RU)
|
||||
* @n_bonded_ch: In case of EDMG the number of bonded channels (1-4)
|
||||
*/
|
||||
struct rate_info {
|
||||
u8 flags;
|
||||
|
|
@ -1220,6 +1316,7 @@ struct rate_info {
|
|||
u8 he_gi;
|
||||
u8 he_dcm;
|
||||
u8 he_ru_alloc;
|
||||
u8 n_bonded_ch;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1315,6 +1412,7 @@ struct cfg80211_tid_stats {
|
|||
* indicate the relevant values in this struct for them
|
||||
* @connected_time: time(in secs) since a station is last connected
|
||||
* @inactive_time: time since last station activity (tx/rx) in milliseconds
|
||||
* @assoc_at: bootime (ns) of the last association
|
||||
* @rx_bytes: bytes (size of MPDUs) received from this station
|
||||
* @tx_bytes: bytes (size of MPDUs) transmitted to this station
|
||||
* @llid: mesh local link id
|
||||
|
|
@ -1375,6 +1473,7 @@ struct station_info {
|
|||
u64 filled;
|
||||
u32 connected_time;
|
||||
u32 inactive_time;
|
||||
u64 assoc_at;
|
||||
u64 rx_bytes;
|
||||
u64 tx_bytes;
|
||||
u16 llid;
|
||||
|
|
@ -2421,6 +2520,9 @@ struct cfg80211_bss_selection {
|
|||
* @fils_erp_rrk_len: Length of @fils_erp_rrk in octets.
|
||||
* @want_1x: indicates user-space supports and wants to use 802.1X driver
|
||||
* offload of 4-way handshake.
|
||||
* @edmg: define the EDMG channels.
|
||||
* This may specify multiple channels and bonding options for the driver
|
||||
* to choose from, based on BSS configuration.
|
||||
*/
|
||||
struct cfg80211_connect_params {
|
||||
struct ieee80211_channel *channel;
|
||||
|
|
@ -2454,6 +2556,7 @@ struct cfg80211_connect_params {
|
|||
const u8 *fils_erp_rrk;
|
||||
size_t fils_erp_rrk_len;
|
||||
bool want_1x;
|
||||
struct ieee80211_edmg edmg;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <uapi/linux/devlink.h>
|
||||
|
||||
|
|
@ -31,10 +32,13 @@ struct devlink {
|
|||
struct list_head reporter_list;
|
||||
struct mutex reporters_lock; /* protects reporter_list */
|
||||
struct devlink_dpipe_headers *dpipe_headers;
|
||||
struct list_head trap_list;
|
||||
struct list_head trap_group_list;
|
||||
const struct devlink_ops *ops;
|
||||
struct device *dev;
|
||||
possible_net_t _net;
|
||||
struct mutex lock;
|
||||
bool reload_failed;
|
||||
char priv[0] __aligned(NETDEV_ALIGN);
|
||||
};
|
||||
|
||||
|
|
@ -72,7 +76,7 @@ struct devlink_port {
|
|||
struct list_head list;
|
||||
struct list_head param_list;
|
||||
struct devlink *devlink;
|
||||
unsigned index;
|
||||
unsigned int index;
|
||||
bool registered;
|
||||
spinlock_t type_lock; /* Protects type and type_dev
|
||||
* pointer consistency.
|
||||
|
|
@ -395,6 +399,7 @@ enum devlink_param_generic_id {
|
|||
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
|
||||
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
|
||||
DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
|
||||
DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE,
|
||||
|
||||
/* add new param generic ids above here*/
|
||||
__DEVLINK_PARAM_GENERIC_ID_MAX,
|
||||
|
|
@ -425,6 +430,10 @@ enum devlink_param_generic_id {
|
|||
#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_NAME "fw_load_policy"
|
||||
#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_TYPE DEVLINK_PARAM_TYPE_U8
|
||||
|
||||
#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_NAME \
|
||||
"reset_dev_on_drv_probe"
|
||||
#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_TYPE DEVLINK_PARAM_TYPE_U8
|
||||
|
||||
#define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate) \
|
||||
{ \
|
||||
.id = DEVLINK_PARAM_GENERIC_ID_##_id, \
|
||||
|
|
@ -455,6 +464,13 @@ enum devlink_param_generic_id {
|
|||
/* Maker of the board */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE "board.manufacture"
|
||||
|
||||
/* Part number, identifier of asic design */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_ASIC_ID "asic.id"
|
||||
/* Revision of asic design */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_ASIC_REV "asic.rev"
|
||||
|
||||
/* Overall FW version */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_FW "fw"
|
||||
/* Control processor FW version */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt"
|
||||
/* Data path microcode controlling high-speed packet processing */
|
||||
|
|
@ -497,8 +513,140 @@ struct devlink_health_reporter_ops {
|
|||
struct devlink_fmsg *fmsg);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct devlink_trap_group - Immutable packet trap group attributes.
|
||||
* @name: Trap group name.
|
||||
* @id: Trap group identifier.
|
||||
* @generic: Whether the trap group is generic or not.
|
||||
*
|
||||
* Describes immutable attributes of packet trap groups that drivers register
|
||||
* with devlink.
|
||||
*/
|
||||
struct devlink_trap_group {
|
||||
const char *name;
|
||||
u16 id;
|
||||
bool generic;
|
||||
};
|
||||
|
||||
#define DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT BIT(0)
|
||||
|
||||
/**
|
||||
* struct devlink_trap - Immutable packet trap attributes.
|
||||
* @type: Trap type.
|
||||
* @init_action: Initial trap action.
|
||||
* @generic: Whether the trap is generic or not.
|
||||
* @id: Trap identifier.
|
||||
* @name: Trap name.
|
||||
* @group: Immutable packet trap group attributes.
|
||||
* @metadata_cap: Metadata types that can be provided by the trap.
|
||||
*
|
||||
* Describes immutable attributes of packet traps that drivers register with
|
||||
* devlink.
|
||||
*/
|
||||
struct devlink_trap {
|
||||
enum devlink_trap_type type;
|
||||
enum devlink_trap_action init_action;
|
||||
bool generic;
|
||||
u16 id;
|
||||
const char *name;
|
||||
struct devlink_trap_group group;
|
||||
u32 metadata_cap;
|
||||
};
|
||||
|
||||
/* All traps must be documented in
|
||||
* Documentation/networking/devlink-trap.rst
|
||||
*/
|
||||
enum devlink_trap_generic_id {
|
||||
DEVLINK_TRAP_GENERIC_ID_SMAC_MC,
|
||||
DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH,
|
||||
DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER,
|
||||
DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER,
|
||||
DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST,
|
||||
DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER,
|
||||
DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE,
|
||||
DEVLINK_TRAP_GENERIC_ID_TTL_ERROR,
|
||||
DEVLINK_TRAP_GENERIC_ID_TAIL_DROP,
|
||||
|
||||
/* Add new generic trap IDs above */
|
||||
__DEVLINK_TRAP_GENERIC_ID_MAX,
|
||||
DEVLINK_TRAP_GENERIC_ID_MAX = __DEVLINK_TRAP_GENERIC_ID_MAX - 1,
|
||||
};
|
||||
|
||||
/* All trap groups must be documented in
|
||||
* Documentation/networking/devlink-trap.rst
|
||||
*/
|
||||
enum devlink_trap_group_generic_id {
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS,
|
||||
|
||||
/* Add new generic trap group IDs above */
|
||||
__DEVLINK_TRAP_GROUP_GENERIC_ID_MAX,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_MAX =
|
||||
__DEVLINK_TRAP_GROUP_GENERIC_ID_MAX - 1,
|
||||
};
|
||||
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_SMAC_MC \
|
||||
"source_mac_is_multicast"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_VLAN_TAG_MISMATCH \
|
||||
"vlan_tag_mismatch"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_VLAN_FILTER \
|
||||
"ingress_vlan_filter"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_STP_FILTER \
|
||||
"ingress_spanning_tree_filter"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_EMPTY_TX_LIST \
|
||||
"port_list_is_empty"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_PORT_LOOPBACK_FILTER \
|
||||
"port_loopback_filter"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_ROUTE \
|
||||
"blackhole_route"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_TTL_ERROR \
|
||||
"ttl_value_is_too_small"
|
||||
#define DEVLINK_TRAP_GENERIC_NAME_TAIL_DROP \
|
||||
"tail_drop"
|
||||
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L2_DROPS \
|
||||
"l2_drops"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_DROPS \
|
||||
"l3_drops"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BUFFER_DROPS \
|
||||
"buffer_drops"
|
||||
|
||||
#define DEVLINK_TRAP_GENERIC(_type, _init_action, _id, _group, _metadata_cap) \
|
||||
{ \
|
||||
.type = DEVLINK_TRAP_TYPE_##_type, \
|
||||
.init_action = DEVLINK_TRAP_ACTION_##_init_action, \
|
||||
.generic = true, \
|
||||
.id = DEVLINK_TRAP_GENERIC_ID_##_id, \
|
||||
.name = DEVLINK_TRAP_GENERIC_NAME_##_id, \
|
||||
.group = _group, \
|
||||
.metadata_cap = _metadata_cap, \
|
||||
}
|
||||
|
||||
#define DEVLINK_TRAP_DRIVER(_type, _init_action, _id, _name, _group, \
|
||||
_metadata_cap) \
|
||||
{ \
|
||||
.type = DEVLINK_TRAP_TYPE_##_type, \
|
||||
.init_action = DEVLINK_TRAP_ACTION_##_init_action, \
|
||||
.generic = false, \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.group = _group, \
|
||||
.metadata_cap = _metadata_cap, \
|
||||
}
|
||||
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC(_id) \
|
||||
{ \
|
||||
.name = DEVLINK_TRAP_GROUP_GENERIC_NAME_##_id, \
|
||||
.id = DEVLINK_TRAP_GROUP_GENERIC_ID_##_id, \
|
||||
.generic = true, \
|
||||
}
|
||||
|
||||
struct devlink_ops {
|
||||
int (*reload)(struct devlink *devlink, struct netlink_ext_ack *extack);
|
||||
int (*reload_down)(struct devlink *devlink,
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*reload_up)(struct devlink *devlink,
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*port_type_set)(struct devlink_port *devlink_port,
|
||||
enum devlink_port_type port_type);
|
||||
int (*port_split)(struct devlink *devlink, unsigned int port_index,
|
||||
|
|
@ -558,6 +706,38 @@ struct devlink_ops {
|
|||
int (*flash_update)(struct devlink *devlink, const char *file_name,
|
||||
const char *component,
|
||||
struct netlink_ext_ack *extack);
|
||||
/**
|
||||
* @trap_init: Trap initialization function.
|
||||
*
|
||||
* Should be used by device drivers to initialize the trap in the
|
||||
* underlying device. Drivers should also store the provided trap
|
||||
* context, so that they could efficiently pass it to
|
||||
* devlink_trap_report() when the trap is triggered.
|
||||
*/
|
||||
int (*trap_init)(struct devlink *devlink,
|
||||
const struct devlink_trap *trap, void *trap_ctx);
|
||||
/**
|
||||
* @trap_fini: Trap de-initialization function.
|
||||
*
|
||||
* Should be used by device drivers to de-initialize the trap in the
|
||||
* underlying device.
|
||||
*/
|
||||
void (*trap_fini)(struct devlink *devlink,
|
||||
const struct devlink_trap *trap, void *trap_ctx);
|
||||
/**
|
||||
* @trap_action_set: Trap action set function.
|
||||
*/
|
||||
int (*trap_action_set)(struct devlink *devlink,
|
||||
const struct devlink_trap *trap,
|
||||
enum devlink_trap_action action);
|
||||
/**
|
||||
* @trap_group_init: Trap group initialization function.
|
||||
*
|
||||
* Should be used by device drivers to initialize the trap group in the
|
||||
* underlying device.
|
||||
*/
|
||||
int (*trap_group_init)(struct devlink *devlink,
|
||||
const struct devlink_trap_group *group);
|
||||
};
|
||||
|
||||
static inline void *devlink_priv(struct devlink *devlink)
|
||||
|
|
@ -702,7 +882,7 @@ struct devlink_region *devlink_region_create(struct devlink *devlink,
|
|||
u64 region_size);
|
||||
void devlink_region_destroy(struct devlink_region *region);
|
||||
u32 devlink_region_shapshot_id_get(struct devlink *devlink);
|
||||
int devlink_region_snapshot_create(struct devlink_region *region, u64 data_len,
|
||||
int devlink_region_snapshot_create(struct devlink_region *region,
|
||||
u8 *data, u32 snapshot_id,
|
||||
devlink_snapshot_data_dest_t *data_destructor);
|
||||
int devlink_info_serial_number_put(struct devlink_info_req *req,
|
||||
|
|
@ -766,6 +946,8 @@ void
|
|||
devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
|
||||
enum devlink_health_reporter_state state);
|
||||
|
||||
bool devlink_is_reload_failed(const struct devlink *devlink);
|
||||
|
||||
void devlink_flash_update_begin_notify(struct devlink *devlink);
|
||||
void devlink_flash_update_end_notify(struct devlink *devlink);
|
||||
void devlink_flash_update_status_notify(struct devlink *devlink,
|
||||
|
|
@ -774,6 +956,17 @@ void devlink_flash_update_status_notify(struct devlink *devlink,
|
|||
unsigned long done,
|
||||
unsigned long total);
|
||||
|
||||
int devlink_traps_register(struct devlink *devlink,
|
||||
const struct devlink_trap *traps,
|
||||
size_t traps_count, void *priv);
|
||||
void devlink_traps_unregister(struct devlink *devlink,
|
||||
const struct devlink_trap *traps,
|
||||
size_t traps_count);
|
||||
void devlink_trap_report(struct devlink *devlink,
|
||||
struct sk_buff *skb, void *trap_ctx,
|
||||
struct devlink_port *in_devlink_port);
|
||||
void *devlink_trap_ctx_priv(void *trap_ctx);
|
||||
|
||||
#if IS_ENABLED(CONFIG_NET_DEVLINK)
|
||||
|
||||
void devlink_compat_running_version(struct net_device *dev,
|
||||
|
|
|
|||
33
include/net/drop_monitor.h
Normal file
33
include/net/drop_monitor.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef _NET_DROP_MONITOR_H_
|
||||
#define _NET_DROP_MONITOR_H_
|
||||
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/**
|
||||
* struct net_dm_hw_metadata - Hardware-supplied packet metadata.
|
||||
* @trap_group_name: Hardware trap group name.
|
||||
* @trap_name: Hardware trap name.
|
||||
* @input_dev: Input netdevice.
|
||||
*/
|
||||
struct net_dm_hw_metadata {
|
||||
const char *trap_group_name;
|
||||
const char *trap_name;
|
||||
struct net_device *input_dev;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_NET_DROP_MONITOR)
|
||||
void net_dm_hw_report(struct sk_buff *skb,
|
||||
const struct net_dm_hw_metadata *hw_metadata);
|
||||
#else
|
||||
static inline void
|
||||
net_dm_hw_report(struct sk_buff *skb,
|
||||
const struct net_dm_hw_metadata *hw_metadata)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NET_DROP_MONITOR_H_ */
|
||||
|
|
@ -41,6 +41,7 @@ struct phylink_link_state;
|
|||
#define DSA_TAG_PROTO_TRAILER_VALUE 11
|
||||
#define DSA_TAG_PROTO_8021Q_VALUE 12
|
||||
#define DSA_TAG_PROTO_SJA1105_VALUE 13
|
||||
#define DSA_TAG_PROTO_KSZ8795_VALUE 14
|
||||
|
||||
enum dsa_tag_protocol {
|
||||
DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE,
|
||||
|
|
@ -57,6 +58,7 @@ enum dsa_tag_protocol {
|
|||
DSA_TAG_PROTO_TRAILER = DSA_TAG_PROTO_TRAILER_VALUE,
|
||||
DSA_TAG_PROTO_8021Q = DSA_TAG_PROTO_8021Q_VALUE,
|
||||
DSA_TAG_PROTO_SJA1105 = DSA_TAG_PROTO_SJA1105_VALUE,
|
||||
DSA_TAG_PROTO_KSZ8795 = DSA_TAG_PROTO_KSZ8795_VALUE,
|
||||
};
|
||||
|
||||
struct packet_type;
|
||||
|
|
@ -273,9 +275,6 @@ struct dsa_switch {
|
|||
*/
|
||||
bool vlan_filtering;
|
||||
|
||||
unsigned long *bitmap;
|
||||
unsigned long _bitmap;
|
||||
|
||||
/* Dynamically allocated ports, keep last */
|
||||
size_t num_ports;
|
||||
struct dsa_port ports[];
|
||||
|
|
@ -516,6 +515,8 @@ struct dsa_switch_ops {
|
|||
bool ingress);
|
||||
void (*port_mirror_del)(struct dsa_switch *ds, int port,
|
||||
struct dsa_mall_mirror_tc_entry *mirror);
|
||||
int (*port_setup_tc)(struct dsa_switch *ds, int port,
|
||||
enum tc_setup_type type, void *type_data);
|
||||
|
||||
/*
|
||||
* Cross-chip operations
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <net/flow_dissector.h>
|
||||
#include <linux/rhashtable.h>
|
||||
|
||||
struct flow_match {
|
||||
struct flow_dissector *dissector;
|
||||
|
|
@ -117,6 +118,8 @@ enum flow_action_id {
|
|||
FLOW_ACTION_GOTO,
|
||||
FLOW_ACTION_REDIRECT,
|
||||
FLOW_ACTION_MIRRED,
|
||||
FLOW_ACTION_REDIRECT_INGRESS,
|
||||
FLOW_ACTION_MIRRED_INGRESS,
|
||||
FLOW_ACTION_VLAN_PUSH,
|
||||
FLOW_ACTION_VLAN_POP,
|
||||
FLOW_ACTION_VLAN_MANGLE,
|
||||
|
|
@ -126,11 +129,16 @@ enum flow_action_id {
|
|||
FLOW_ACTION_ADD,
|
||||
FLOW_ACTION_CSUM,
|
||||
FLOW_ACTION_MARK,
|
||||
FLOW_ACTION_PTYPE,
|
||||
FLOW_ACTION_WAKE,
|
||||
FLOW_ACTION_QUEUE,
|
||||
FLOW_ACTION_SAMPLE,
|
||||
FLOW_ACTION_POLICE,
|
||||
FLOW_ACTION_CT,
|
||||
FLOW_ACTION_MPLS_PUSH,
|
||||
FLOW_ACTION_MPLS_POP,
|
||||
FLOW_ACTION_MPLS_MANGLE,
|
||||
NUM_FLOW_ACTIONS,
|
||||
};
|
||||
|
||||
/* This is mirroring enum pedit_header_type definition for easy mapping between
|
||||
|
|
@ -146,8 +154,12 @@ enum flow_action_mangle_base {
|
|||
FLOW_ACT_MANGLE_HDR_TYPE_UDP,
|
||||
};
|
||||
|
||||
typedef void (*action_destr)(void *priv);
|
||||
|
||||
struct flow_action_entry {
|
||||
enum flow_action_id id;
|
||||
action_destr destructor;
|
||||
void *destructor_priv;
|
||||
union {
|
||||
u32 chain_index; /* FLOW_ACTION_GOTO */
|
||||
struct net_device *dev; /* FLOW_ACTION_REDIRECT */
|
||||
|
|
@ -162,9 +174,10 @@ struct flow_action_entry {
|
|||
u32 mask;
|
||||
u32 val;
|
||||
} mangle;
|
||||
const struct ip_tunnel_info *tunnel; /* FLOW_ACTION_TUNNEL_ENCAP */
|
||||
struct ip_tunnel_info *tunnel; /* FLOW_ACTION_TUNNEL_ENCAP */
|
||||
u32 csum_flags; /* FLOW_ACTION_CSUM */
|
||||
u32 mark; /* FLOW_ACTION_MARK */
|
||||
u16 ptype; /* FLOW_ACTION_PTYPE */
|
||||
struct { /* FLOW_ACTION_QUEUE */
|
||||
u32 ctx;
|
||||
u32 index;
|
||||
|
|
@ -184,6 +197,22 @@ struct flow_action_entry {
|
|||
int action;
|
||||
u16 zone;
|
||||
} ct;
|
||||
struct { /* FLOW_ACTION_MPLS_PUSH */
|
||||
u32 label;
|
||||
__be16 proto;
|
||||
u8 tc;
|
||||
u8 bos;
|
||||
u8 ttl;
|
||||
} mpls_push;
|
||||
struct { /* FLOW_ACTION_MPLS_POP */
|
||||
__be16 proto;
|
||||
} mpls_pop;
|
||||
struct { /* FLOW_ACTION_MPLS_MANGLE */
|
||||
u32 label;
|
||||
u8 tc;
|
||||
u8 bos;
|
||||
u8 ttl;
|
||||
} mpls_mangle;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -259,6 +288,7 @@ struct flow_block_offload {
|
|||
enum flow_block_command command;
|
||||
enum flow_block_binder_type binder_type;
|
||||
bool block_shared;
|
||||
bool unlocked_driver_cb;
|
||||
struct net *net;
|
||||
struct flow_block *block;
|
||||
struct list_head cb_list;
|
||||
|
|
@ -347,4 +377,40 @@ static inline void flow_block_init(struct flow_block *flow_block)
|
|||
INIT_LIST_HEAD(&flow_block->cb_list);
|
||||
}
|
||||
|
||||
typedef int flow_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv,
|
||||
enum tc_setup_type type, void *type_data);
|
||||
|
||||
typedef void flow_indr_block_ing_cmd_t(struct net_device *dev,
|
||||
flow_indr_block_bind_cb_t *cb,
|
||||
void *cb_priv,
|
||||
enum flow_block_command command);
|
||||
|
||||
struct flow_indr_block_ing_entry {
|
||||
flow_indr_block_ing_cmd_t *cb;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
void flow_indr_add_block_ing_cb(struct flow_indr_block_ing_entry *entry);
|
||||
|
||||
void flow_indr_del_block_ing_cb(struct flow_indr_block_ing_entry *entry);
|
||||
|
||||
int __flow_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
flow_indr_block_bind_cb_t *cb,
|
||||
void *cb_ident);
|
||||
|
||||
void __flow_indr_block_cb_unregister(struct net_device *dev,
|
||||
flow_indr_block_bind_cb_t *cb,
|
||||
void *cb_ident);
|
||||
|
||||
int flow_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
flow_indr_block_bind_cb_t *cb, void *cb_ident);
|
||||
|
||||
void flow_indr_block_cb_unregister(struct net_device *dev,
|
||||
flow_indr_block_bind_cb_t *cb,
|
||||
void *cb_ident);
|
||||
|
||||
void flow_indr_block_call(struct net_device *dev,
|
||||
struct flow_block_offload *bo,
|
||||
enum flow_block_command command);
|
||||
|
||||
#endif /* _NET_FLOW_OFFLOAD_H */
|
||||
|
|
|
|||
|
|
@ -89,9 +89,9 @@ struct ip6_sf_socklist {
|
|||
struct ipv6_mc_socklist {
|
||||
struct in6_addr addr;
|
||||
int ifindex;
|
||||
unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */
|
||||
struct ipv6_mc_socklist __rcu *next;
|
||||
rwlock_t sflock;
|
||||
unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */
|
||||
struct ip6_sf_socklist *sflist;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ struct inet_connection_sock {
|
|||
const struct tcp_congestion_ops *icsk_ca_ops;
|
||||
const struct inet_connection_sock_af_ops *icsk_af_ops;
|
||||
const struct tcp_ulp_ops *icsk_ulp_ops;
|
||||
void *icsk_ulp_data;
|
||||
void __rcu *icsk_ulp_data;
|
||||
void (*icsk_clean_acked)(struct sock *sk, u32 acked_seq);
|
||||
struct hlist_node icsk_listen_portaddr_node;
|
||||
unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu);
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ struct inet_cork {
|
|||
char priority;
|
||||
__u16 gso_size;
|
||||
u64 transmit_time;
|
||||
u32 mark;
|
||||
};
|
||||
|
||||
struct inet_cork_full {
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ static inline void ipcm_init_sk(struct ipcm_cookie *ipcm,
|
|||
{
|
||||
ipcm_init(ipcm);
|
||||
|
||||
ipcm->sockc.mark = inet->sk.sk_mark;
|
||||
ipcm->sockc.tsflags = inet->sk.sk_tsflags;
|
||||
ipcm->oif = inet->sk.sk_bound_dev_if;
|
||||
ipcm->addr = inet->inet_saddr;
|
||||
|
|
|
|||
|
|
@ -315,6 +315,7 @@ struct ieee80211_vif_chanctx_switch {
|
|||
* @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder
|
||||
* functionality changed for this BSS (AP mode).
|
||||
* @BSS_CHANGED_TWT: TWT status changed
|
||||
* @BSS_CHANGED_HE_OBSS_PD: OBSS Packet Detection status changed.
|
||||
*
|
||||
*/
|
||||
enum ieee80211_bss_change {
|
||||
|
|
@ -346,6 +347,7 @@ enum ieee80211_bss_change {
|
|||
BSS_CHANGED_MCAST_RATE = 1<<25,
|
||||
BSS_CHANGED_FTM_RESPONDER = 1<<26,
|
||||
BSS_CHANGED_TWT = 1<<27,
|
||||
BSS_CHANGED_HE_OBSS_PD = 1<<28,
|
||||
|
||||
/* when adding here, make sure to change ieee80211_reconfig */
|
||||
};
|
||||
|
|
@ -600,6 +602,8 @@ struct ieee80211_ftm_responder_params {
|
|||
* nontransmitted BSSIDs
|
||||
* @profile_periodicity: the least number of beacon frames need to be received
|
||||
* in order to discover all the nontransmitted BSSIDs in the set.
|
||||
* @he_operation: HE operation information of the AP we are connected to
|
||||
* @he_obss_pd: OBSS Packet Detection parameters.
|
||||
*/
|
||||
struct ieee80211_bss_conf {
|
||||
const u8 *bssid;
|
||||
|
|
@ -661,6 +665,8 @@ struct ieee80211_bss_conf {
|
|||
u8 bssid_indicator;
|
||||
bool ema_ap;
|
||||
u8 profile_periodicity;
|
||||
struct ieee80211_he_operation he_operation;
|
||||
struct ieee80211_he_obss_pd he_obss_pd;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1058,11 +1064,13 @@ struct ieee80211_tx_info {
|
|||
* @sta: Station that the packet was transmitted for
|
||||
* @info: Basic tx status information
|
||||
* @skb: Packet skb (can be NULL if not provided by the driver)
|
||||
* @rate: The TX rate that was used when sending the packet
|
||||
*/
|
||||
struct ieee80211_tx_status {
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct sk_buff *skb;
|
||||
struct rate_info *rate;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1702,6 +1710,9 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif);
|
|||
* a TKIP key if it only requires MIC space. Do not set together with
|
||||
* @IEEE80211_KEY_FLAG_GENERATE_MMIC on the same key.
|
||||
* @IEEE80211_KEY_FLAG_NO_AUTO_TX: Key needs explicit Tx activation.
|
||||
* @IEEE80211_KEY_FLAG_GENERATE_MMIE: This flag should be set by the driver
|
||||
* for a AES_CMAC key to indicate that it requires sequence number
|
||||
* generation only
|
||||
*/
|
||||
enum ieee80211_key_flags {
|
||||
IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0),
|
||||
|
|
@ -1714,6 +1725,7 @@ enum ieee80211_key_flags {
|
|||
IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(7),
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE = BIT(8),
|
||||
IEEE80211_KEY_FLAG_NO_AUTO_TX = BIT(9),
|
||||
IEEE80211_KEY_FLAG_GENERATE_MMIE = BIT(10),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -2268,11 +2280,9 @@ struct ieee80211_txq {
|
|||
* @IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID: Hardware supports multi BSSID
|
||||
* only for HE APs. Applies if @IEEE80211_HW_SUPPORTS_MULTI_BSSID is set.
|
||||
*
|
||||
* @IEEE80211_HW_EXT_KEY_ID_NATIVE: Driver and hardware are supporting Extended
|
||||
* Key ID and can handle two unicast keys per station for Rx and Tx.
|
||||
*
|
||||
* @IEEE80211_HW_NO_AMPDU_KEYBORDER_SUPPORT: The card/driver can't handle
|
||||
* active Tx A-MPDU sessions with Extended Key IDs during rekey.
|
||||
* @IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT: The card and driver is only
|
||||
* aggregating MPDUs with the same keyid, allowing mac80211 to keep Tx
|
||||
* A-MPDU sessions active while rekeying with Extended Key ID.
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
|
|
@ -2325,8 +2335,7 @@ enum ieee80211_hw_flags {
|
|||
IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
|
||||
IEEE80211_HW_SUPPORTS_MULTI_BSSID,
|
||||
IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
|
||||
IEEE80211_HW_EXT_KEY_ID_NATIVE,
|
||||
IEEE80211_HW_NO_AMPDU_KEYBORDER_SUPPORT,
|
||||
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
|
|
@ -2454,6 +2463,8 @@ enum ieee80211_hw_flags {
|
|||
*
|
||||
* @weight_multiplier: Driver specific airtime weight multiplier used while
|
||||
* refilling deficit of each TXQ.
|
||||
*
|
||||
* @max_mtu: the max mtu could be set.
|
||||
*/
|
||||
struct ieee80211_hw {
|
||||
struct ieee80211_conf conf;
|
||||
|
|
@ -2491,6 +2502,7 @@ struct ieee80211_hw {
|
|||
u8 max_nan_de_entries;
|
||||
u8 tx_sk_pacing_shift;
|
||||
u8 weight_multiplier;
|
||||
u32 max_mtu;
|
||||
};
|
||||
|
||||
static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw,
|
||||
|
|
@ -3914,7 +3926,8 @@ struct ieee80211_ops {
|
|||
struct ieee80211_channel *chan,
|
||||
int duration,
|
||||
enum ieee80211_roc_type type);
|
||||
int (*cancel_remain_on_channel)(struct ieee80211_hw *hw);
|
||||
int (*cancel_remain_on_channel)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx);
|
||||
void (*get_ringparam)(struct ieee80211_hw *hw,
|
||||
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
|
||||
|
|
@ -5945,7 +5958,6 @@ struct rate_control_ops {
|
|||
|
||||
void (*add_sta_debugfs)(void *priv, void *priv_sta,
|
||||
struct dentry *dir);
|
||||
void (*remove_sta_debugfs)(void *priv, void *priv_sta);
|
||||
|
||||
u32 (*get_expected_throughput)(void *priv_sta);
|
||||
};
|
||||
|
|
@ -6234,10 +6246,36 @@ void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid);
|
|||
* but for the duration of the frame handling.
|
||||
* However, also note that while in the wake_tx_queue() method,
|
||||
* rcu_read_lock() is already held.
|
||||
*
|
||||
* softirqs must also be disabled when this function is called.
|
||||
* In process context, use ieee80211_tx_dequeue_ni() instead.
|
||||
*/
|
||||
struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq);
|
||||
|
||||
/**
|
||||
* ieee80211_tx_dequeue_ni - dequeue a packet from a software tx queue
|
||||
* (in process context)
|
||||
*
|
||||
* Like ieee80211_tx_dequeue() but can be called in process context
|
||||
* (internally disables bottom halves).
|
||||
*
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw()
|
||||
* @txq: pointer obtained from station or virtual interface, or from
|
||||
* ieee80211_next_txq()
|
||||
*/
|
||||
static inline struct sk_buff *ieee80211_tx_dequeue_ni(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
local_bh_disable();
|
||||
skb = ieee80211_tx_dequeue(hw, txq);
|
||||
local_bh_enable();
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_next_txq - get next tx queue to pull packets from
|
||||
*
|
||||
|
|
|
|||
|
|
@ -103,9 +103,6 @@ struct net {
|
|||
/* core fib_rules */
|
||||
struct list_head rules_ops;
|
||||
|
||||
struct list_head fib_notifier_ops; /* Populated by
|
||||
* register_pernet_subsys()
|
||||
*/
|
||||
struct net_device *loopback_dev; /* The loopback */
|
||||
struct netns_core core;
|
||||
struct netns_mib mib;
|
||||
|
|
@ -169,6 +166,9 @@ struct net {
|
|||
#endif
|
||||
#ifdef CONFIG_XDP_SOCKETS
|
||||
struct netns_xdp xdp;
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_CRYPTO_USER)
|
||||
struct sock *crypto_nlsk;
|
||||
#endif
|
||||
struct sock *diag_nlsk;
|
||||
atomic_t fnhe_genid;
|
||||
|
|
|
|||
|
|
@ -2,16 +2,22 @@
|
|||
#ifndef _BR_NETFILTER_H_
|
||||
#define _BR_NETFILTER_H_
|
||||
|
||||
#include <linux/netfilter.h>
|
||||
|
||||
#include "../../../net/bridge/br_private.h"
|
||||
|
||||
static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
|
||||
struct nf_bridge_info *b = skb_ext_add(skb, SKB_EXT_BRIDGE_NF);
|
||||
|
||||
if (b)
|
||||
memset(b, 0, sizeof(*b));
|
||||
|
||||
return b;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void nf_bridge_update_protocol(struct sk_buff *skb);
|
||||
|
|
@ -36,10 +42,14 @@ int br_nf_pre_routing_finish_bridge(struct net *net, struct sock *sk, struct sk_
|
|||
|
||||
static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
|
||||
struct net_bridge_port *port;
|
||||
|
||||
port = br_port_get_rcu(dev);
|
||||
return port ? &port->br->fake_rtable : NULL;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
struct net_device *setup_pre_routing(struct sk_buff *skb,
|
||||
|
|
@ -57,7 +67,7 @@ static inline int br_validate_ipv6(struct net *net, struct sk_buff *skb)
|
|||
}
|
||||
|
||||
static inline unsigned int
|
||||
br_nf_pre_routing_ipv6(const struct nf_hook_ops *ops, struct sk_buff *skb,
|
||||
br_nf_pre_routing_ipv6(void *priv, struct sk_buff *skb,
|
||||
const struct nf_hook_state *state)
|
||||
{
|
||||
return NF_ACCEPT;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
#ifndef _NF_DUP_IPV4_H_
|
||||
#define _NF_DUP_IPV4_H_
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <uapi/linux/in.h>
|
||||
|
||||
void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
const struct in_addr *gw, int oif);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* ICMPv6 tracking.
|
||||
*
|
||||
* 21 Apl 2004: Yasuyuki Kozakai @USAGI <yasuyuki.kozakai@toshiba.co.jp>
|
||||
* - separated from nf_conntrack_icmp.h
|
||||
*
|
||||
* Derived from include/linux/netfiter_ipv4/ip_conntrack_icmp.h
|
||||
*/
|
||||
|
||||
#ifndef _NF_CONNTRACK_ICMPV6_H
|
||||
#define _NF_CONNTRACK_ICMPV6_H
|
||||
|
||||
#ifndef ICMPV6_NI_QUERY
|
||||
#define ICMPV6_NI_QUERY 139
|
||||
#endif
|
||||
#ifndef ICMPV6_NI_REPLY
|
||||
#define ICMPV6_NI_REPLY 140
|
||||
#endif
|
||||
|
||||
#endif /* _NF_CONNTRACK_ICMPV6_H */
|
||||
|
|
@ -2,7 +2,9 @@
|
|||
#ifndef _NF_DEFRAG_IPV6_H
|
||||
#define _NF_DEFRAG_IPV6_H
|
||||
|
||||
struct net;
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
int nf_defrag_ipv6_enable(struct net *);
|
||||
|
||||
int nf_ct_frag6_init(void);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
#ifndef _NF_DUP_IPV6_H_
|
||||
#define _NF_DUP_IPV6_H_
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
const struct in6_addr *gw, int oif);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,17 +13,14 @@
|
|||
#ifndef _NF_CONNTRACK_H
|
||||
#define _NF_CONNTRACK_H
|
||||
|
||||
#include <linux/netfilter/nf_conntrack_common.h>
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
#include <linux/netfilter/nf_conntrack_common.h>
|
||||
#include <linux/netfilter/nf_conntrack_tcp.h>
|
||||
#include <linux/netfilter/nf_conntrack_dccp.h>
|
||||
#include <linux/netfilter/nf_conntrack_sctp.h>
|
||||
#include <linux/netfilter/nf_conntrack_proto_gre.h>
|
||||
#include <net/netfilter/ipv6/nf_conntrack_icmpv6.h>
|
||||
|
||||
#include <net/netfilter/nf_conntrack_tuple.h>
|
||||
|
||||
|
|
@ -148,16 +145,14 @@ void nf_conntrack_alter_reply(struct nf_conn *ct,
|
|||
int nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_conn *ignored_conntrack);
|
||||
|
||||
#define NFCT_INFOMASK 7UL
|
||||
#define NFCT_PTRMASK ~(NFCT_INFOMASK)
|
||||
|
||||
/* Return conntrack_info and tuple hash for given skb. */
|
||||
static inline struct nf_conn *
|
||||
nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)
|
||||
{
|
||||
*ctinfo = skb->_nfct & NFCT_INFOMASK;
|
||||
unsigned long nfct = skb_get_nfct(skb);
|
||||
|
||||
return (struct nf_conn *)(skb->_nfct & NFCT_PTRMASK);
|
||||
*ctinfo = nfct & NFCT_INFOMASK;
|
||||
return (struct nf_conn *)(nfct & NFCT_PTRMASK);
|
||||
}
|
||||
|
||||
/* decrement reference count on a conntrack */
|
||||
|
|
@ -321,7 +316,7 @@ u32 nf_ct_get_id(const struct nf_conn *ct);
|
|||
static inline void
|
||||
nf_ct_set(struct sk_buff *skb, struct nf_conn *ct, enum ip_conntrack_info info)
|
||||
{
|
||||
skb->_nfct = (unsigned long)ct | info;
|
||||
skb_set_nfct(skb, (unsigned long)ct | info);
|
||||
}
|
||||
|
||||
#define NF_CT_STAT_INC(net, count) __this_cpu_inc((net)->ct.stat->count)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ struct nf_conn_acct *nf_conn_acct_find(const struct nf_conn *ct)
|
|||
static inline
|
||||
struct nf_conn_acct *nf_ct_acct_ext_add(struct nf_conn *ct, gfp_t gfp)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
struct net *net = nf_ct_net(ct);
|
||||
struct nf_conn_acct *acct;
|
||||
|
||||
|
|
@ -41,22 +42,32 @@ struct nf_conn_acct *nf_ct_acct_ext_add(struct nf_conn *ct, gfp_t gfp)
|
|||
|
||||
|
||||
return acct;
|
||||
};
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Check if connection tracking accounting is enabled */
|
||||
static inline bool nf_ct_acct_enabled(struct net *net)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
return net->ct.sysctl_acct != 0;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Enable/disable connection tracking accounting */
|
||||
static inline void nf_ct_set_acct(struct net *net, bool enable)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
net->ct.sysctl_acct = enable;
|
||||
#endif
|
||||
}
|
||||
|
||||
void nf_conntrack_acct_pernet_init(struct net *net);
|
||||
|
||||
int nf_conntrack_acct_init(void);
|
||||
void nf_conntrack_acct_fini(void);
|
||||
|
||||
#endif /* _NF_CONNTRACK_ACCT_H */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
#ifndef NF_CONNTRACK_BRIDGE_
|
||||
#define NF_CONNTRACK_BRIDGE_
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/if_ether.h>
|
||||
|
||||
struct nf_hook_ops;
|
||||
|
||||
struct nf_ct_bridge_info {
|
||||
struct nf_hook_ops *ops;
|
||||
unsigned int ops_size;
|
||||
|
|
@ -10,11 +16,4 @@ struct nf_ct_bridge_info {
|
|||
void nf_ct_bridge_register(struct nf_ct_bridge_info *info);
|
||||
void nf_ct_bridge_unregister(struct nf_ct_bridge_info *info);
|
||||
|
||||
struct nf_ct_bridge_frag_data {
|
||||
char mac[ETH_HLEN];
|
||||
bool vlan_present;
|
||||
u16 vlan_tci;
|
||||
__be16 vlan_proto;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -14,13 +14,16 @@
|
|||
#define _NF_CONNTRACK_CORE_H
|
||||
|
||||
#include <linux/netfilter.h>
|
||||
#include <net/netfilter/nf_conntrack_l4proto.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include <net/netfilter/nf_conntrack_ecache.h>
|
||||
#include <net/netfilter/nf_conntrack_l4proto.h>
|
||||
|
||||
/* This header is used to share core functionality between the
|
||||
standalone connection tracking module, and the compatibility layer's use
|
||||
of connection tracking. */
|
||||
unsigned int nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state);
|
||||
|
||||
unsigned int nf_conntrack_in(struct sk_buff *skb,
|
||||
const struct nf_hook_state *state);
|
||||
|
||||
int nf_conntrack_init_net(struct net *net);
|
||||
void nf_conntrack_cleanup_net(struct net *net);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
#define _NF_CONNTRACK_COUNT_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <net/netfilter/nf_conntrack_tuple.h>
|
||||
#include <net/netfilter/nf_conntrack_zones.h>
|
||||
|
||||
struct nf_conncount_data;
|
||||
|
||||
|
|
|
|||
|
|
@ -61,9 +61,10 @@ nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp)
|
|||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
|
||||
/* This structure is passed to event handler */
|
||||
struct nf_ct_event {
|
||||
struct nf_conn *ct;
|
||||
|
|
@ -84,9 +85,26 @@ void nf_ct_deliver_cached_events(struct nf_conn *ct);
|
|||
int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,
|
||||
u32 portid, int report);
|
||||
|
||||
#else
|
||||
|
||||
static inline void nf_ct_deliver_cached_events(const struct nf_conn *ct)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int nf_conntrack_eventmask_report(unsigned int eventmask,
|
||||
struct nf_conn *ct,
|
||||
u32 portid,
|
||||
int report)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline void
|
||||
nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
struct net *net = nf_ct_net(ct);
|
||||
struct nf_conntrack_ecache *e;
|
||||
|
||||
|
|
@ -98,31 +116,42 @@ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
|
|||
return;
|
||||
|
||||
set_bit(event, &e->cache);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int
|
||||
nf_conntrack_event_report(enum ip_conntrack_events event, struct nf_conn *ct,
|
||||
u32 portid, int report)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
const struct net *net = nf_ct_net(ct);
|
||||
|
||||
if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
|
||||
return 0;
|
||||
|
||||
return nf_conntrack_eventmask_report(1 << event, ct, portid, report);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int
|
||||
nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
const struct net *net = nf_ct_net(ct);
|
||||
|
||||
if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
|
||||
return 0;
|
||||
|
||||
return nf_conntrack_eventmask_report(1 << event, ct, 0, 0);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
|
||||
struct nf_exp_event {
|
||||
struct nf_conntrack_expect *exp;
|
||||
u32 portid;
|
||||
|
|
@ -148,41 +177,18 @@ void nf_conntrack_ecache_pernet_fini(struct net *net);
|
|||
int nf_conntrack_ecache_init(void);
|
||||
void nf_conntrack_ecache_fini(void);
|
||||
|
||||
static inline void nf_conntrack_ecache_delayed_work(struct net *net)
|
||||
{
|
||||
if (!delayed_work_pending(&net->ct.ecache_dwork)) {
|
||||
schedule_delayed_work(&net->ct.ecache_dwork, HZ);
|
||||
net->ct.ecache_dwork_pending = true;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_work(struct net *net)
|
||||
{
|
||||
if (net->ct.ecache_dwork_pending) {
|
||||
net->ct.ecache_dwork_pending = false;
|
||||
mod_delayed_work(system_wq, &net->ct.ecache_dwork, 0);
|
||||
}
|
||||
}
|
||||
#else /* CONFIG_NF_CONNTRACK_EVENTS */
|
||||
static inline void nf_conntrack_event_cache(enum ip_conntrack_events event,
|
||||
struct nf_conn *ct) {}
|
||||
static inline int nf_conntrack_eventmask_report(unsigned int eventmask,
|
||||
struct nf_conn *ct,
|
||||
u32 portid,
|
||||
int report) { return 0; }
|
||||
static inline int nf_conntrack_event(enum ip_conntrack_events event,
|
||||
struct nf_conn *ct) { return 0; }
|
||||
static inline int nf_conntrack_event_report(enum ip_conntrack_events event,
|
||||
struct nf_conn *ct,
|
||||
u32 portid,
|
||||
int report) { return 0; }
|
||||
static inline void nf_ct_deliver_cached_events(const struct nf_conn *ct) {}
|
||||
|
||||
static inline void nf_ct_expect_event_report(enum ip_conntrack_expect_events e,
|
||||
struct nf_conntrack_expect *exp,
|
||||
u32 portid,
|
||||
int report) {}
|
||||
u32 portid,
|
||||
int report)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_pernet_init(struct net *net) {}
|
||||
static inline void nf_conntrack_ecache_pernet_init(struct net *net)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_pernet_fini(struct net *net)
|
||||
{
|
||||
|
|
@ -197,14 +203,26 @@ static inline void nf_conntrack_ecache_fini(void)
|
|||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NF_CONNTRACK_EVENTS */
|
||||
|
||||
static inline void nf_conntrack_ecache_delayed_work(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
if (!delayed_work_pending(&net->ct.ecache_dwork)) {
|
||||
schedule_delayed_work(&net->ct.ecache_dwork, HZ);
|
||||
net->ct.ecache_dwork_pending = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_work(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
if (net->ct.ecache_dwork_pending) {
|
||||
net->ct.ecache_dwork_pending = false;
|
||||
mod_delayed_work(system_wq, &net->ct.ecache_dwork, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_NF_CONNTRACK_EVENTS */
|
||||
|
||||
#endif /*_NF_CONNTRACK_ECACHE_H*/
|
||||
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ void nf_ct_expect_init(struct nf_conntrack_expect *, unsigned int, u_int8_t,
|
|||
const union nf_inet_addr *,
|
||||
u_int8_t, const __be16 *, const __be16 *);
|
||||
void nf_ct_expect_put(struct nf_conntrack_expect *exp);
|
||||
int nf_ct_expect_related_report(struct nf_conntrack_expect *expect,
|
||||
int nf_ct_expect_related_report(struct nf_conntrack_expect *expect,
|
||||
u32 portid, int report, unsigned int flags);
|
||||
static inline int nf_ct_expect_related(struct nf_conntrack_expect *expect,
|
||||
unsigned int flags)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
enum nf_ct_ext_id {
|
||||
NF_CT_EXT_HELPER,
|
||||
#if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE)
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
NF_CT_EXT_NAT,
|
||||
#endif
|
||||
NF_CT_EXT_SEQADJ,
|
||||
|
|
|
|||
|
|
@ -176,42 +176,44 @@ void nf_ct_l4proto_log_invalid(const struct sk_buff *skb,
|
|||
const char *fmt, ...) { }
|
||||
#endif /* CONFIG_SYSCTL */
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
static inline struct nf_generic_net *nf_generic_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.generic;
|
||||
return &net->ct.nf_ct_proto.generic;
|
||||
}
|
||||
|
||||
static inline struct nf_tcp_net *nf_tcp_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.tcp;
|
||||
return &net->ct.nf_ct_proto.tcp;
|
||||
}
|
||||
|
||||
static inline struct nf_udp_net *nf_udp_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.udp;
|
||||
return &net->ct.nf_ct_proto.udp;
|
||||
}
|
||||
|
||||
static inline struct nf_icmp_net *nf_icmp_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.icmp;
|
||||
return &net->ct.nf_ct_proto.icmp;
|
||||
}
|
||||
|
||||
static inline struct nf_icmp_net *nf_icmpv6_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.icmpv6;
|
||||
return &net->ct.nf_ct_proto.icmpv6;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NF_CT_PROTO_DCCP
|
||||
static inline struct nf_dccp_net *nf_dccp_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.dccp;
|
||||
return &net->ct.nf_ct_proto.dccp;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NF_CT_PROTO_SCTP
|
||||
static inline struct nf_sctp_net *nf_sctp_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.sctp;
|
||||
return &net->ct.nf_ct_proto.sctp;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#include <linux/types.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
#ifndef _NF_CONNTRACK_LABELS_H
|
||||
#define _NF_CONNTRACK_LABELS_H
|
||||
|
||||
#include <linux/netfilter/nf_conntrack_common.h>
|
||||
#include <linux/netfilter/nf_conntrack_tuple_common.h>
|
||||
#include <linux/types.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include <net/netfilter/nf_conntrack_extend.h>
|
||||
|
||||
#include <uapi/linux/netfilter/xt_connlabel.h>
|
||||
|
||||
#define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE)
|
||||
|
|
@ -51,3 +54,5 @@ static inline void nf_conntrack_labels_fini(void) {}
|
|||
static inline int nf_connlabels_get(struct net *net, unsigned int bit) { return 0; }
|
||||
static inline void nf_connlabels_put(struct net *net) {}
|
||||
#endif
|
||||
|
||||
#endif /* _NF_CONNTRACK_LABELS_H */
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ static inline struct nf_conn_synproxy *nfct_synproxy_ext_add(struct nf_conn *ct)
|
|||
static inline bool nf_ct_add_synproxy(struct nf_conn *ct,
|
||||
const struct nf_conn *tmpl)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NETFILTER_SYNPROXY)
|
||||
if (tmpl && nfct_synproxy(tmpl)) {
|
||||
if (!nfct_seqadj_ext_add(ct))
|
||||
return false;
|
||||
|
|
@ -39,47 +40,9 @@ static inline bool nf_ct_add_synproxy(struct nf_conn *ct,
|
|||
if (!nfct_synproxy_ext_add(ct))
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct synproxy_stats {
|
||||
unsigned int syn_received;
|
||||
unsigned int cookie_invalid;
|
||||
unsigned int cookie_valid;
|
||||
unsigned int cookie_retrans;
|
||||
unsigned int conn_reopened;
|
||||
};
|
||||
|
||||
struct synproxy_net {
|
||||
struct nf_conn *tmpl;
|
||||
struct synproxy_stats __percpu *stats;
|
||||
unsigned int hook_ref4;
|
||||
unsigned int hook_ref6;
|
||||
};
|
||||
|
||||
extern unsigned int synproxy_net_id;
|
||||
static inline struct synproxy_net *synproxy_pernet(struct net *net)
|
||||
{
|
||||
return net_generic(net, synproxy_net_id);
|
||||
}
|
||||
|
||||
struct synproxy_options {
|
||||
u8 options;
|
||||
u8 wscale;
|
||||
u16 mss;
|
||||
u16 mss_encode;
|
||||
u32 tsval;
|
||||
u32 tsecr;
|
||||
};
|
||||
|
||||
struct tcphdr;
|
||||
struct nf_synproxy_info;
|
||||
bool synproxy_parse_options(const struct sk_buff *skb, unsigned int doff,
|
||||
const struct tcphdr *th,
|
||||
struct synproxy_options *opts);
|
||||
|
||||
void synproxy_init_timestamp_cookie(const struct nf_synproxy_info *info,
|
||||
struct synproxy_options *opts);
|
||||
|
||||
#endif /* _NF_CONNTRACK_SYNPROXY_H */
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ struct nf_conn_timeout {
|
|||
static inline unsigned int *
|
||||
nf_ct_timeout_data(const struct nf_conn_timeout *t)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
struct nf_ct_timeout *timeout;
|
||||
|
||||
timeout = rcu_dereference(t->timeout);
|
||||
|
|
@ -39,6 +40,9 @@ nf_ct_timeout_data(const struct nf_conn_timeout *t)
|
|||
return NULL;
|
||||
|
||||
return (unsigned int *)timeout->data;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
|
|
|
|||
|
|
@ -38,16 +38,6 @@ struct nf_conn_tstamp *nf_ct_tstamp_ext_add(struct nf_conn *ct, gfp_t gfp)
|
|||
#endif
|
||||
};
|
||||
|
||||
static inline bool nf_ct_tstamp_enabled(struct net *net)
|
||||
{
|
||||
return net->ct.sysctl_tstamp != 0;
|
||||
}
|
||||
|
||||
static inline void nf_ct_set_tstamp(struct net *net, bool enable)
|
||||
{
|
||||
net->ct.sysctl_tstamp = enable;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
|
||||
void nf_conntrack_tstamp_pernet_init(struct net *net);
|
||||
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ struct nf_conntrack_tuple_hash {
|
|||
|
||||
static inline bool __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
{
|
||||
{
|
||||
return (nf_inet_addr_cmp(&t1->src.u3, &t2->src.u3) &&
|
||||
t1->src.u.all == t2->src.u.all &&
|
||||
t1->src.l3num == t2->src.l3num);
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@
|
|||
#define _NF_CONNTRACK_ZONES_H
|
||||
|
||||
#include <linux/netfilter/nf_conntrack_zones_common.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
#include <net/netfilter/nf_conntrack_extend.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
|
||||
static inline const struct nf_conntrack_zone *
|
||||
nf_ct_zone(const struct nf_conn *ct)
|
||||
|
|
@ -87,5 +85,5 @@ static inline bool nf_ct_zone_equal_any(const struct nf_conn *a,
|
|||
return true;
|
||||
#endif
|
||||
}
|
||||
#endif /* IS_ENABLED(CONFIG_NF_CONNTRACK) */
|
||||
|
||||
#endif /* _NF_CONNTRACK_ZONES_H */
|
||||
|
|
|
|||
|
|
@ -2,7 +2,15 @@
|
|||
#ifndef _NF_DUP_NETDEV_H_
|
||||
#define _NF_DUP_NETDEV_H_
|
||||
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
|
||||
void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif);
|
||||
void nf_fwd_netdev_egress(const struct nft_pktinfo *pkt, int oif);
|
||||
|
||||
struct nft_offload_ctx;
|
||||
struct nft_flow_rule;
|
||||
|
||||
int nft_fwd_dup_netdev_offload(struct nft_offload_ctx *ctx,
|
||||
struct nft_flow_rule *flow,
|
||||
enum flow_action_id id, int oif);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/rhashtable-types.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter/nf_conntrack_tuple_common.h>
|
||||
#include <net/dst.h>
|
||||
|
||||
|
|
@ -122,4 +123,4 @@ unsigned int nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
|
|||
#define MODULE_ALIAS_NF_FLOWTABLE(family) \
|
||||
MODULE_ALIAS("nf-flowtable-" __stringify(family))
|
||||
|
||||
#endif /* _FLOW_OFFLOAD_H */
|
||||
#endif /* _NF_FLOW_TABLE_H */
|
||||
|
|
|
|||
|
|
@ -1,9 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _NF_NAT_H
|
||||
#define _NF_NAT_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/netfilter_ipv4.h>
|
||||
#include <linux/netfilter/nf_nat.h>
|
||||
#include <linux/netfilter/nf_conntrack_pptp.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include <net/netfilter/nf_conntrack_extend.h>
|
||||
#include <net/netfilter/nf_conntrack_tuple.h>
|
||||
#include <uapi/linux/netfilter/nf_nat.h>
|
||||
|
||||
enum nf_nat_manip_type {
|
||||
NF_NAT_MANIP_SRC,
|
||||
|
|
@ -14,20 +19,14 @@ enum nf_nat_manip_type {
|
|||
#define HOOK2MANIP(hooknum) ((hooknum) != NF_INET_POST_ROUTING && \
|
||||
(hooknum) != NF_INET_LOCAL_IN)
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/netfilter/nf_conntrack_pptp.h>
|
||||
#include <net/netfilter/nf_conntrack_extend.h>
|
||||
|
||||
/* per conntrack: nat application helper private data */
|
||||
union nf_conntrack_nat_help {
|
||||
/* insert nat helper private data here */
|
||||
#if defined(CONFIG_NF_NAT_PPTP) || defined(CONFIG_NF_NAT_PPTP_MODULE)
|
||||
#if IS_ENABLED(CONFIG_NF_NAT_PPTP)
|
||||
struct nf_nat_pptp nat_pptp_info;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct nf_conn;
|
||||
|
||||
/* The structure embedded in the conntrack structure. */
|
||||
struct nf_conn_nat {
|
||||
union nf_conntrack_nat_help help;
|
||||
|
|
@ -48,7 +47,7 @@ struct nf_conn_nat *nf_ct_nat_ext_add(struct nf_conn *ct);
|
|||
|
||||
static inline struct nf_conn_nat *nfct_nat(const struct nf_conn *ct)
|
||||
{
|
||||
#if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE)
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
return nf_ct_ext_find(ct, NF_CT_EXT_NAT);
|
||||
#else
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
#define _NF_NAT_HELPER_H
|
||||
/* NAT protocol helper routines. */
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
|
||||
struct sk_buff;
|
||||
#include <net/netfilter/nf_conntrack_expect.h>
|
||||
|
||||
/* These return true or false. */
|
||||
bool __nf_nat_mangle_tcp_packet(struct sk_buff *skb, struct nf_conn *ct,
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#ifndef _NF_NAT_MASQUERADE_H_
|
||||
#define _NF_NAT_MASQUERADE_H_
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/netfilter/nf_nat.h>
|
||||
|
||||
unsigned int
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
#ifndef _NF_NAT_REDIRECT_H_
|
||||
#define _NF_NAT_REDIRECT_H_
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <uapi/linux/netfilter/nf_nat.h>
|
||||
|
||||
unsigned int
|
||||
nf_nat_redirect_ipv4(struct sk_buff *skb,
|
||||
const struct nf_nat_ipv4_multi_range_compat *mr,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/* Each queued (to userspace) skbuff has one of these. */
|
||||
struct nf_queue_entry {
|
||||
|
|
@ -121,4 +123,5 @@ nfqueue_hash(const struct sk_buff *skb, u16 queue, u16 queues_total, u8 family,
|
|||
|
||||
int nf_queue(struct sk_buff *skb, struct nf_hook_state *state,
|
||||
unsigned int index, unsigned int verdict);
|
||||
|
||||
#endif /* _NF_QUEUE_H */
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
#ifndef _NF_REJECT_H
|
||||
#define _NF_REJECT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/in.h>
|
||||
|
||||
static inline bool nf_reject_verify_csum(__u8 proto)
|
||||
{
|
||||
/* Skip protocols that don't use 16-bit one's complement checksum
|
||||
|
|
|
|||
|
|
@ -11,6 +11,44 @@
|
|||
#include <net/netfilter/nf_conntrack_seqadj.h>
|
||||
#include <net/netfilter/nf_conntrack_synproxy.h>
|
||||
|
||||
struct synproxy_stats {
|
||||
unsigned int syn_received;
|
||||
unsigned int cookie_invalid;
|
||||
unsigned int cookie_valid;
|
||||
unsigned int cookie_retrans;
|
||||
unsigned int conn_reopened;
|
||||
};
|
||||
|
||||
struct synproxy_net {
|
||||
struct nf_conn *tmpl;
|
||||
struct synproxy_stats __percpu *stats;
|
||||
unsigned int hook_ref4;
|
||||
unsigned int hook_ref6;
|
||||
};
|
||||
|
||||
extern unsigned int synproxy_net_id;
|
||||
static inline struct synproxy_net *synproxy_pernet(struct net *net)
|
||||
{
|
||||
return net_generic(net, synproxy_net_id);
|
||||
}
|
||||
|
||||
struct synproxy_options {
|
||||
u8 options;
|
||||
u8 wscale;
|
||||
u16 mss_option;
|
||||
u16 mss_encode;
|
||||
u32 tsval;
|
||||
u32 tsecr;
|
||||
};
|
||||
|
||||
struct nf_synproxy_info;
|
||||
bool synproxy_parse_options(const struct sk_buff *skb, unsigned int doff,
|
||||
const struct tcphdr *th,
|
||||
struct synproxy_options *opts);
|
||||
|
||||
void synproxy_init_timestamp_cookie(const struct nf_synproxy_info *info,
|
||||
struct synproxy_options *opts);
|
||||
|
||||
void synproxy_send_client_synack(struct net *net, const struct sk_buff *skb,
|
||||
const struct tcphdr *th,
|
||||
const struct synproxy_options *opts);
|
||||
|
|
@ -20,6 +58,8 @@ bool synproxy_recv_client_ack(struct net *net,
|
|||
const struct tcphdr *th,
|
||||
struct synproxy_options *opts, u32 recv_seq);
|
||||
|
||||
struct nf_hook_state;
|
||||
|
||||
unsigned int ipv4_synproxy_hook(void *priv, struct sk_buff *skb,
|
||||
const struct nf_hook_state *nhs);
|
||||
int nf_synproxy_ipv4_init(struct synproxy_net *snet, struct net *net);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#ifndef _NET_NF_TABLES_H
|
||||
#define _NET_NF_TABLES_H
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
|
|
@ -100,33 +101,43 @@ struct nft_regs {
|
|||
};
|
||||
};
|
||||
|
||||
/* Store/load an u16 or u8 integer to/from the u32 data register.
|
||||
/* Store/load an u8, u16 or u64 integer to/from the u32 data register.
|
||||
*
|
||||
* Note, when using concatenations, register allocation happens at 32-bit
|
||||
* level. So for store instruction, pad the rest part with zero to avoid
|
||||
* garbage values.
|
||||
*/
|
||||
|
||||
static inline void nft_reg_store16(u32 *dreg, u16 val)
|
||||
{
|
||||
*dreg = 0;
|
||||
*(u16 *)dreg = val;
|
||||
}
|
||||
|
||||
static inline void nft_reg_store8(u32 *dreg, u8 val)
|
||||
{
|
||||
*dreg = 0;
|
||||
*(u8 *)dreg = val;
|
||||
}
|
||||
|
||||
static inline u8 nft_reg_load8(u32 *sreg)
|
||||
{
|
||||
return *(u8 *)sreg;
|
||||
}
|
||||
|
||||
static inline void nft_reg_store16(u32 *dreg, u16 val)
|
||||
{
|
||||
*dreg = 0;
|
||||
*(u16 *)dreg = val;
|
||||
}
|
||||
|
||||
static inline u16 nft_reg_load16(u32 *sreg)
|
||||
{
|
||||
return *(u16 *)sreg;
|
||||
}
|
||||
|
||||
static inline u8 nft_reg_load8(u32 *sreg)
|
||||
static inline void nft_reg_store64(u32 *dreg, u64 val)
|
||||
{
|
||||
return *(u8 *)sreg;
|
||||
put_unaligned(val, (u64 *)dreg);
|
||||
}
|
||||
|
||||
static inline u64 nft_reg_load64(u32 *sreg)
|
||||
{
|
||||
return get_unaligned((u64 *)sreg);
|
||||
}
|
||||
|
||||
static inline void nft_data_copy(u32 *dst, const struct nft_data *src,
|
||||
|
|
@ -289,17 +300,23 @@ struct nft_expr;
|
|||
* struct nft_set_ops - nf_tables set operations
|
||||
*
|
||||
* @lookup: look up an element within the set
|
||||
* @update: update an element if exists, add it if doesn't exist
|
||||
* @delete: delete an element
|
||||
* @insert: insert new element into set
|
||||
* @activate: activate new element in the next generation
|
||||
* @deactivate: lookup for element and deactivate it in the next generation
|
||||
* @flush: deactivate element in the next generation
|
||||
* @remove: remove element from set
|
||||
* @walk: iterate over all set elemeennts
|
||||
* @walk: iterate over all set elements
|
||||
* @get: get set elements
|
||||
* @privsize: function to return size of set private data
|
||||
* @init: initialize private data of new set instance
|
||||
* @destroy: destroy private data of set instance
|
||||
* @elemsize: element private size
|
||||
*
|
||||
* Operations lookup, update and delete have simpler interfaces, are faster
|
||||
* and currently only used in the packet path. All the rest are slower,
|
||||
* control plane functions.
|
||||
*/
|
||||
struct nft_set_ops {
|
||||
bool (*lookup)(const struct net *net,
|
||||
|
|
@ -314,6 +331,8 @@ struct nft_set_ops {
|
|||
const struct nft_expr *expr,
|
||||
struct nft_regs *regs,
|
||||
const struct nft_set_ext **ext);
|
||||
bool (*delete)(const struct nft_set *set,
|
||||
const u32 *key);
|
||||
|
||||
int (*insert)(const struct net *net,
|
||||
const struct nft_set *set,
|
||||
|
|
@ -1102,6 +1121,7 @@ struct nft_object_type {
|
|||
* @init: initialize object from netlink attributes
|
||||
* @destroy: release existing stateful object
|
||||
* @dump: netlink dump stateful object
|
||||
* @update: update stateful object
|
||||
*/
|
||||
struct nft_object_ops {
|
||||
void (*eval)(struct nft_object *obj,
|
||||
|
|
@ -1116,6 +1136,8 @@ struct nft_object_ops {
|
|||
int (*dump)(struct sk_buff *skb,
|
||||
struct nft_object *obj,
|
||||
bool reset);
|
||||
void (*update)(struct nft_object *obj,
|
||||
struct nft_object *newobj);
|
||||
const struct nft_object_type *type;
|
||||
};
|
||||
|
||||
|
|
@ -1206,6 +1228,8 @@ void nft_trace_notify(struct nft_traceinfo *info);
|
|||
#define MODULE_ALIAS_NFT_OBJ(type) \
|
||||
MODULE_ALIAS("nft-obj-" __stringify(type))
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_TABLES)
|
||||
|
||||
/*
|
||||
* The gencursor defines two generations, the currently active and the
|
||||
* next one. Objects contain a bitmask of 2 bits specifying the generations
|
||||
|
|
@ -1279,6 +1303,8 @@ static inline void nft_set_elem_change_active(const struct net *net,
|
|||
ext->genmask ^= nft_genmask_next(net);
|
||||
}
|
||||
|
||||
#endif /* IS_ENABLED(CONFIG_NF_TABLES) */
|
||||
|
||||
/*
|
||||
* We use a free bit in the genmask field to indicate the element
|
||||
* is busy, meaning it is currently being processed either by
|
||||
|
|
@ -1398,10 +1424,16 @@ struct nft_trans_elem {
|
|||
|
||||
struct nft_trans_obj {
|
||||
struct nft_object *obj;
|
||||
struct nft_object *newobj;
|
||||
bool update;
|
||||
};
|
||||
|
||||
#define nft_trans_obj(trans) \
|
||||
(((struct nft_trans_obj *)trans->data)->obj)
|
||||
#define nft_trans_obj_newobj(trans) \
|
||||
(((struct nft_trans_obj *)trans->data)->newobj)
|
||||
#define nft_trans_obj_update(trans) \
|
||||
(((struct nft_trans_obj *)trans->data)->update)
|
||||
|
||||
struct nft_trans_flowtable {
|
||||
struct nft_flowtable *flowtable;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/netfilter_ipv6/ip6_tables.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
|
||||
static inline void nft_set_pktinfo_ipv6(struct nft_pktinfo *pkt,
|
||||
struct sk_buff *skb)
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ struct nft_offload_reg {
|
|||
u32 len;
|
||||
u32 base_offset;
|
||||
u32 offset;
|
||||
struct nft_data data;
|
||||
struct nft_data mask;
|
||||
};
|
||||
|
||||
|
|
@ -25,6 +26,7 @@ struct nft_offload_ctx {
|
|||
u8 protonum;
|
||||
} dep;
|
||||
unsigned int num_actions;
|
||||
struct net *net;
|
||||
struct nft_offload_reg regs[NFT_REG32_15 + 1];
|
||||
};
|
||||
|
||||
|
|
@ -60,7 +62,7 @@ struct nft_flow_rule {
|
|||
#define NFT_OFFLOAD_F_ACTION (1 << 0)
|
||||
|
||||
struct nft_rule;
|
||||
struct nft_flow_rule *nft_flow_rule_create(const struct nft_rule *rule);
|
||||
struct nft_flow_rule *nft_flow_rule_create(struct net *net, const struct nft_rule *rule);
|
||||
void nft_flow_rule_destroy(struct nft_flow_rule *flow);
|
||||
int nft_flow_rule_offload_commit(struct net *net);
|
||||
|
||||
|
|
@ -75,4 +77,7 @@ int nft_flow_rule_offload_commit(struct net *net);
|
|||
|
||||
int nft_chain_offload_priority(struct nft_base_chain *basechain);
|
||||
|
||||
int nft_offload_init(void);
|
||||
void nft_offload_exit(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
#ifndef _NFT_FIB_H_
|
||||
#define _NFT_FIB_H_
|
||||
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
|
||||
struct nft_fib {
|
||||
enum nft_registers dreg:8;
|
||||
u8 result;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
#ifndef _NFT_META_H_
|
||||
#define _NFT_META_H_
|
||||
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
|
||||
struct nft_meta {
|
||||
enum nft_meta_keys key:8;
|
||||
union {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,11 @@
|
|||
#ifndef _NFT_REJECT_H_
|
||||
#define _NFT_REJECT_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/netfilter/nf_tables.h>
|
||||
#include <uapi/linux/netfilter/nf_tables.h>
|
||||
|
||||
struct nft_reject {
|
||||
enum nft_reject_types type:8;
|
||||
u8 icmp_code;
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@
|
|||
#include <linux/spinlock.h>
|
||||
|
||||
struct can_dev_rcv_lists;
|
||||
struct s_stats;
|
||||
struct s_pstats;
|
||||
struct can_pkg_stats;
|
||||
struct can_rcv_lists_stats;
|
||||
|
||||
struct netns_can {
|
||||
#if IS_ENABLED(CONFIG_PROC_FS)
|
||||
|
|
@ -28,11 +28,11 @@ struct netns_can {
|
|||
#endif
|
||||
|
||||
/* receive filters subscribed for 'all' CAN devices */
|
||||
struct can_dev_rcv_lists *can_rx_alldev_list;
|
||||
spinlock_t can_rcvlists_lock;
|
||||
struct timer_list can_stattimer;/* timer for statistics update */
|
||||
struct s_stats *can_stats; /* packet statistics */
|
||||
struct s_pstats *can_pstats; /* receive list statistics */
|
||||
struct can_dev_rcv_lists *rx_alldev_list;
|
||||
spinlock_t rcvlists_lock;
|
||||
struct timer_list stattimer; /* timer for statistics update */
|
||||
struct can_pkg_stats *pkg_stats;
|
||||
struct can_rcv_lists_stats *rcv_lists_stats;
|
||||
|
||||
/* CAN GW per-net gateway jobs */
|
||||
struct hlist_head cgw_list;
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ struct netns_ipv4 {
|
|||
int sysctl_tcp_l3mdev_accept;
|
||||
#endif
|
||||
int sysctl_tcp_mtu_probing;
|
||||
int sysctl_tcp_mtu_probe_floor;
|
||||
int sysctl_tcp_base_mss;
|
||||
int sysctl_tcp_min_snd_mss;
|
||||
int sysctl_tcp_probe_threshold;
|
||||
|
|
|
|||
|
|
@ -128,6 +128,9 @@ struct netns_sctp {
|
|||
/* Flag to indicate if stream interleave is enabled */
|
||||
int intl_enable;
|
||||
|
||||
/* Flag to indicate if ecn is enabled */
|
||||
int ecn_enable;
|
||||
|
||||
/*
|
||||
* Policy to control SCTP IPv4 address scoping
|
||||
* 0 - Disable IPv4 address scoping
|
||||
|
|
|
|||
|
|
@ -70,15 +70,6 @@ static inline struct Qdisc *tcf_block_q(struct tcf_block *block)
|
|||
return block->q;
|
||||
}
|
||||
|
||||
int __tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident);
|
||||
int tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident);
|
||||
void __tc_indr_block_cb_unregister(struct net_device *dev,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident);
|
||||
void tc_indr_block_cb_unregister(struct net_device *dev,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident);
|
||||
|
||||
int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode);
|
||||
|
||||
|
|
@ -137,32 +128,6 @@ void tc_setup_cb_block_unregister(struct tcf_block *block, flow_setup_cb_t *cb,
|
|||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
int __tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
void __tc_indr_block_cb_unregister(struct net_device *dev,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void tc_indr_block_cb_unregister(struct net_device *dev,
|
||||
tc_indr_block_bind_cb_t *cb, void *cb_ident)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode)
|
||||
{
|
||||
|
|
@ -539,9 +504,26 @@ tcf_match_indev(struct sk_buff *skb, int ifindex)
|
|||
}
|
||||
|
||||
int tc_setup_flow_action(struct flow_action *flow_action,
|
||||
const struct tcf_exts *exts);
|
||||
const struct tcf_exts *exts, bool rtnl_held);
|
||||
void tc_cleanup_flow_action(struct flow_action *flow_action);
|
||||
|
||||
int tc_setup_cb_call(struct tcf_block *block, enum tc_setup_type type,
|
||||
void *type_data, bool err_stop);
|
||||
void *type_data, bool err_stop, bool rtnl_held);
|
||||
int tc_setup_cb_add(struct tcf_block *block, struct tcf_proto *tp,
|
||||
enum tc_setup_type type, void *type_data, bool err_stop,
|
||||
u32 *flags, unsigned int *in_hw_count, bool rtnl_held);
|
||||
int tc_setup_cb_replace(struct tcf_block *block, struct tcf_proto *tp,
|
||||
enum tc_setup_type type, void *type_data, bool err_stop,
|
||||
u32 *old_flags, unsigned int *old_in_hw_count,
|
||||
u32 *new_flags, unsigned int *new_in_hw_count,
|
||||
bool rtnl_held);
|
||||
int tc_setup_cb_destroy(struct tcf_block *block, struct tcf_proto *tp,
|
||||
enum tc_setup_type type, void *type_data, bool err_stop,
|
||||
u32 *flags, unsigned int *in_hw_count, bool rtnl_held);
|
||||
int tc_setup_cb_reoffload(struct tcf_block *block, struct tcf_proto *tp,
|
||||
bool add, flow_setup_cb_t *cb,
|
||||
enum tc_setup_type type, void *type_data,
|
||||
void *cb_priv, u32 *flags, unsigned int *in_hw_count);
|
||||
unsigned int tcf_exts_num_actions(struct tcf_exts *exts);
|
||||
|
||||
struct tc_cls_u32_knode {
|
||||
|
|
|
|||
|
|
@ -118,7 +118,12 @@ void __qdisc_run(struct Qdisc *q);
|
|||
static inline void qdisc_run(struct Qdisc *q)
|
||||
{
|
||||
if (qdisc_run_begin(q)) {
|
||||
__qdisc_run(q);
|
||||
/* NOLOCK qdisc must check 'state' under the qdisc seqlock
|
||||
* to avoid racing with dev_qdisc_reset()
|
||||
*/
|
||||
if (!(q->flags & TCQ_F_NOLOCK) ||
|
||||
likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state)))
|
||||
__qdisc_run(q);
|
||||
qdisc_run_end(q);
|
||||
}
|
||||
}
|
||||
|
|
@ -161,4 +166,27 @@ struct tc_etf_qopt_offload {
|
|||
s32 queue;
|
||||
};
|
||||
|
||||
struct tc_taprio_sched_entry {
|
||||
u8 command; /* TC_TAPRIO_CMD_* */
|
||||
|
||||
/* The gate_mask in the offloading side refers to traffic classes */
|
||||
u32 gate_mask;
|
||||
u32 interval;
|
||||
};
|
||||
|
||||
struct tc_taprio_qopt_offload {
|
||||
u8 enable;
|
||||
ktime_t base_time;
|
||||
u64 cycle_time;
|
||||
u64 cycle_time_extension;
|
||||
|
||||
size_t num_entries;
|
||||
struct tc_taprio_sched_entry entries[0];
|
||||
};
|
||||
|
||||
/* Reference counting */
|
||||
struct tc_taprio_qopt_offload *taprio_offload_get(struct tc_taprio_qopt_offload
|
||||
*offload);
|
||||
void taprio_offload_free(struct tc_taprio_qopt_offload *offload);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ struct psample_group {
|
|||
};
|
||||
|
||||
struct psample_group *psample_group_get(struct net *net, u32 group_num);
|
||||
void psample_group_take(struct psample_group *group);
|
||||
void psample_group_put(struct psample_group *group);
|
||||
|
||||
#if IS_ENABLED(CONFIG_PSAMPLE)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@
|
|||
#include <linux/refcount.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <net/gen_stats.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/flow_offload.h>
|
||||
|
|
@ -23,9 +25,6 @@ struct tcf_walker;
|
|||
struct module;
|
||||
struct bpf_flow_keys;
|
||||
|
||||
typedef int tc_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv,
|
||||
enum tc_setup_type type, void *type_data);
|
||||
|
||||
struct qdisc_rate_table {
|
||||
struct tc_ratespec rate;
|
||||
u32 data[256];
|
||||
|
|
@ -313,6 +312,10 @@ struct tcf_proto_ops {
|
|||
int (*reoffload)(struct tcf_proto *tp, bool add,
|
||||
flow_setup_cb_t *cb, void *cb_priv,
|
||||
struct netlink_ext_ack *extack);
|
||||
void (*hw_add)(struct tcf_proto *tp,
|
||||
void *type_data);
|
||||
void (*hw_del)(struct tcf_proto *tp,
|
||||
void *type_data);
|
||||
void (*bind_class)(void *, u32, unsigned long);
|
||||
void * (*tmplt_create)(struct net *net,
|
||||
struct tcf_chain *chain,
|
||||
|
|
@ -399,11 +402,13 @@ struct tcf_block {
|
|||
refcount_t refcnt;
|
||||
struct net *net;
|
||||
struct Qdisc *q;
|
||||
struct rw_semaphore cb_lock; /* protects cb_list and offload counters */
|
||||
struct flow_block flow_block;
|
||||
struct list_head owner_list;
|
||||
bool keep_dst;
|
||||
unsigned int offloadcnt; /* Number of oddloaded filters */
|
||||
atomic_t offloadcnt; /* Number of oddloaded filters */
|
||||
unsigned int nooffloaddevcnt; /* Number of devs unable to do offload */
|
||||
unsigned int lockeddevcnt; /* Number of devs that require rtnl lock. */
|
||||
struct {
|
||||
struct tcf_chain *chain;
|
||||
struct list_head filter_chain_list;
|
||||
|
|
@ -439,37 +444,6 @@ static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
|
|||
#define tcf_proto_dereference(p, tp) \
|
||||
rcu_dereference_protected(p, lockdep_tcf_proto_is_locked(tp))
|
||||
|
||||
static inline void tcf_block_offload_inc(struct tcf_block *block, u32 *flags)
|
||||
{
|
||||
if (*flags & TCA_CLS_FLAGS_IN_HW)
|
||||
return;
|
||||
*flags |= TCA_CLS_FLAGS_IN_HW;
|
||||
block->offloadcnt++;
|
||||
}
|
||||
|
||||
static inline void tcf_block_offload_dec(struct tcf_block *block, u32 *flags)
|
||||
{
|
||||
if (!(*flags & TCA_CLS_FLAGS_IN_HW))
|
||||
return;
|
||||
*flags &= ~TCA_CLS_FLAGS_IN_HW;
|
||||
block->offloadcnt--;
|
||||
}
|
||||
|
||||
static inline void
|
||||
tc_cls_offload_cnt_update(struct tcf_block *block, u32 *cnt,
|
||||
u32 *flags, bool add)
|
||||
{
|
||||
if (add) {
|
||||
if (!*cnt)
|
||||
tcf_block_offload_inc(block, flags);
|
||||
(*cnt)++;
|
||||
} else {
|
||||
(*cnt)--;
|
||||
if (!*cnt)
|
||||
tcf_block_offload_dec(block, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
|
||||
{
|
||||
struct qdisc_skb_cb *qcb;
|
||||
|
|
|
|||
|
|
@ -107,5 +107,7 @@ int sctp_auth_del_key_id(struct sctp_endpoint *ep,
|
|||
struct sctp_association *asoc, __u16 key_id);
|
||||
int sctp_auth_deact_key_id(struct sctp_endpoint *ep,
|
||||
struct sctp_association *asoc, __u16 key_id);
|
||||
int sctp_auth_init(struct sctp_endpoint *ep, gfp_t gfp);
|
||||
void sctp_auth_free(struct sctp_endpoint *ep);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1322,9 +1322,11 @@ struct sctp_endpoint {
|
|||
/* SCTP-AUTH: endpoint shared keys */
|
||||
struct list_head endpoint_shared_keys;
|
||||
__u16 active_key_id;
|
||||
__u8 auth_enable:1,
|
||||
__u8 ecn_enable:1,
|
||||
auth_enable:1,
|
||||
intl_enable:1,
|
||||
prsctp_enable:1,
|
||||
asconf_enable:1,
|
||||
reconf_enable:1;
|
||||
|
||||
__u8 strreset_enable;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ struct sock_reuseport {
|
|||
unsigned int synq_overflow_ts;
|
||||
/* ID stays the same even after the size of socks[] grows. */
|
||||
unsigned int reuseport_id;
|
||||
bool bind_inany;
|
||||
unsigned int bind_inany:1;
|
||||
unsigned int has_conns:1;
|
||||
struct bpf_prog __rcu *prog; /* optional BPF sock selector */
|
||||
struct sock *socks[0]; /* array of sock pointers */
|
||||
};
|
||||
|
|
@ -37,6 +38,23 @@ extern struct sock *reuseport_select_sock(struct sock *sk,
|
|||
extern int reuseport_attach_prog(struct sock *sk, struct bpf_prog *prog);
|
||||
extern int reuseport_detach_prog(struct sock *sk);
|
||||
|
||||
static inline bool reuseport_has_conns(struct sock *sk, bool set)
|
||||
{
|
||||
struct sock_reuseport *reuse;
|
||||
bool ret = false;
|
||||
|
||||
rcu_read_lock();
|
||||
reuse = rcu_dereference(sk->sk_reuseport_cb);
|
||||
if (reuse) {
|
||||
if (set)
|
||||
reuse->has_conns = 1;
|
||||
ret = reuse->has_conns;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int reuseport_get_id(struct sock_reuseport *reuse);
|
||||
|
||||
#endif /* _SOCK_REUSEPORT_H */
|
||||
|
|
|
|||
|
|
@ -32,6 +32,24 @@ static inline bool is_tcf_mirred_egress_mirror(const struct tc_action *a)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline bool is_tcf_mirred_ingress_redirect(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->id == TCA_ID_MIRRED)
|
||||
return to_mirred(a)->tcfm_eaction == TCA_INGRESS_REDIR;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool is_tcf_mirred_ingress_mirror(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->id == TCA_ID_MIRRED)
|
||||
return to_mirred(a)->tcfm_eaction == TCA_INGRESS_MIRROR;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct net_device *tcf_mirred_dev(const struct tc_action *a)
|
||||
{
|
||||
return rtnl_dereference(to_mirred(a)->tcfm_dev);
|
||||
|
|
|
|||
|
|
@ -27,4 +27,79 @@ struct tcf_mpls {
|
|||
};
|
||||
#define to_mpls(a) ((struct tcf_mpls *)a)
|
||||
|
||||
static inline bool is_tcf_mpls(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->id == TCA_ID_MPLS)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u32 tcf_mpls_action(const struct tc_action *a)
|
||||
{
|
||||
u32 tcfm_action;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_action = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_action;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_action;
|
||||
}
|
||||
|
||||
static inline __be16 tcf_mpls_proto(const struct tc_action *a)
|
||||
{
|
||||
__be16 tcfm_proto;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_proto = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_proto;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_proto;
|
||||
}
|
||||
|
||||
static inline u32 tcf_mpls_label(const struct tc_action *a)
|
||||
{
|
||||
u32 tcfm_label;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_label = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_label;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_label;
|
||||
}
|
||||
|
||||
static inline u8 tcf_mpls_tc(const struct tc_action *a)
|
||||
{
|
||||
u8 tcfm_tc;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_tc = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_tc;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_tc;
|
||||
}
|
||||
|
||||
static inline u8 tcf_mpls_bos(const struct tc_action *a)
|
||||
{
|
||||
u8 tcfm_bos;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_bos = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_bos;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_bos;
|
||||
}
|
||||
|
||||
static inline u8 tcf_mpls_ttl(const struct tc_action *a)
|
||||
{
|
||||
u8 tcfm_ttl;
|
||||
|
||||
rcu_read_lock();
|
||||
tcfm_ttl = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_ttl;
|
||||
rcu_read_unlock();
|
||||
|
||||
return tcfm_ttl;
|
||||
}
|
||||
|
||||
#endif /* __NET_TC_MPLS_H */
|
||||
|
|
|
|||
|
|
@ -41,10 +41,4 @@ static inline int tcf_sample_trunc_size(const struct tc_action *a)
|
|||
return to_sample(a)->trunc_size;
|
||||
}
|
||||
|
||||
static inline struct psample_group *
|
||||
tcf_sample_psample_group(const struct tc_action *a)
|
||||
{
|
||||
return rcu_dereference_rtnl(to_sample(a)->psample_group);
|
||||
}
|
||||
|
||||
#endif /* __NET_TC_SAMPLE_H */
|
||||
|
|
|
|||
|
|
@ -54,4 +54,31 @@ static inline u32 tcf_skbedit_mark(const struct tc_action *a)
|
|||
return mark;
|
||||
}
|
||||
|
||||
/* Return true iff action is ptype */
|
||||
static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
u32 flags;
|
||||
|
||||
if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
|
||||
rcu_read_lock();
|
||||
flags = rcu_dereference(to_skbedit(a)->params)->flags;
|
||||
rcu_read_unlock();
|
||||
return flags == SKBEDIT_F_PTYPE;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
|
||||
{
|
||||
u16 ptype;
|
||||
|
||||
rcu_read_lock();
|
||||
ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
|
||||
rcu_read_unlock();
|
||||
|
||||
return ptype;
|
||||
}
|
||||
|
||||
#endif /* __NET_TC_SKBEDIT_H */
|
||||
|
|
|
|||
|
|
@ -59,4 +59,21 @@ static inline struct ip_tunnel_info *tcf_tunnel_info(const struct tc_action *a)
|
|||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct ip_tunnel_info *
|
||||
tcf_tunnel_info_copy(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
struct ip_tunnel_info *tun = tcf_tunnel_info(a);
|
||||
|
||||
if (tun) {
|
||||
size_t tun_size = sizeof(*tun) + tun->options_len;
|
||||
struct ip_tunnel_info *tun_copy = kmemdup(tun, tun_size,
|
||||
GFP_KERNEL);
|
||||
|
||||
return tun_copy;
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
#endif /* __NET_TC_TUNNEL_KEY_H */
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
|
|||
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
|
||||
#define TCP_MIN_MSS 88U
|
||||
|
||||
/* The least MTU to use for probing */
|
||||
/* The initial MTU to use for probing */
|
||||
#define TCP_BASE_MSS 1024
|
||||
|
||||
/* probing interval, default to 10 minutes as per RFC4821 */
|
||||
|
|
@ -414,6 +414,16 @@ void tcp_parse_options(const struct net *net, const struct sk_buff *skb,
|
|||
int estab, struct tcp_fastopen_cookie *foc);
|
||||
const u8 *tcp_parse_md5sig_option(const struct tcphdr *th);
|
||||
|
||||
/*
|
||||
* BPF SKB-less helpers
|
||||
*/
|
||||
u16 tcp_v4_get_syncookie(struct sock *sk, struct iphdr *iph,
|
||||
struct tcphdr *th, u32 *cookie);
|
||||
u16 tcp_v6_get_syncookie(struct sock *sk, struct ipv6hdr *iph,
|
||||
struct tcphdr *th, u32 *cookie);
|
||||
u16 tcp_get_syncookie_mss(struct request_sock_ops *rsk_ops,
|
||||
const struct tcp_request_sock_ops *af_ops,
|
||||
struct sock *sk, struct tcphdr *th);
|
||||
/*
|
||||
* TCP v4 functions exported for the inet6 API
|
||||
*/
|
||||
|
|
@ -2112,6 +2122,9 @@ struct tcp_ulp_ops {
|
|||
void (*update)(struct sock *sk, struct proto *p);
|
||||
/* cleanup ulp */
|
||||
void (*release)(struct sock *sk);
|
||||
/* diagnostic */
|
||||
int (*get_info)(const struct sock *sk, struct sk_buff *skb);
|
||||
size_t (*get_info_size)(const struct sock *sk);
|
||||
|
||||
char name[TCP_ULP_NAME_MAX];
|
||||
struct module *owner;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include <linux/tcp.h>
|
||||
#include <linux/skmsg.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
#include <net/tcp.h>
|
||||
#include <net/strparser.h>
|
||||
|
|
@ -274,22 +275,13 @@ struct tls_context {
|
|||
struct proto *sk_proto;
|
||||
|
||||
void (*sk_destruct)(struct sock *sk);
|
||||
void (*sk_proto_close)(struct sock *sk, long timeout);
|
||||
|
||||
int (*setsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
unsigned int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
int __user *optlen);
|
||||
int (*hash)(struct sock *sk);
|
||||
void (*unhash)(struct sock *sk);
|
||||
|
||||
union tls_crypto_context crypto_send;
|
||||
union tls_crypto_context crypto_recv;
|
||||
|
||||
struct list_head list;
|
||||
refcount_t refcount;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
enum tls_offload_ctx_dir {
|
||||
|
|
@ -348,7 +340,7 @@ struct tls_offload_context_rx {
|
|||
#define TLS_OFFLOAD_CONTEXT_SIZE_RX \
|
||||
(sizeof(struct tls_offload_context_rx) + TLS_DRIVER_STATE_SIZE_RX)
|
||||
|
||||
void tls_ctx_free(struct tls_context *ctx);
|
||||
void tls_ctx_free(struct sock *sk, struct tls_context *ctx);
|
||||
int wait_on_pending_writer(struct sock *sk, long *timeo);
|
||||
int tls_sk_query(struct sock *sk, int optname, char __user *optval,
|
||||
int __user *optlen);
|
||||
|
|
@ -374,13 +366,9 @@ ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos,
|
|||
struct pipe_inode_info *pipe,
|
||||
size_t len, unsigned int flags);
|
||||
|
||||
int tls_set_device_offload(struct sock *sk, struct tls_context *ctx);
|
||||
int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
|
||||
int tls_device_sendpage(struct sock *sk, struct page *page,
|
||||
int offset, size_t size, int flags);
|
||||
void tls_device_free_resources_tx(struct sock *sk);
|
||||
void tls_device_init(void);
|
||||
void tls_device_cleanup(void);
|
||||
int tls_tx_records(struct sock *sk, int flags);
|
||||
|
||||
struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
|
||||
|
|
@ -429,6 +417,23 @@ static inline bool is_tx_ready(struct tls_sw_context_tx *ctx)
|
|||
return READ_ONCE(rec->tx_ready);
|
||||
}
|
||||
|
||||
static inline u16 tls_user_config(struct tls_context *ctx, bool tx)
|
||||
{
|
||||
u16 config = tx ? ctx->tx_conf : ctx->rx_conf;
|
||||
|
||||
switch (config) {
|
||||
case TLS_BASE:
|
||||
return TLS_CONF_BASE;
|
||||
case TLS_SW:
|
||||
return TLS_CONF_SW;
|
||||
case TLS_HW:
|
||||
return TLS_CONF_HW;
|
||||
case TLS_HW_RECORD:
|
||||
return TLS_CONF_HW_RECORD;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sk_buff *
|
||||
tls_validate_xmit_skb(struct sock *sk, struct net_device *dev,
|
||||
struct sk_buff *skb);
|
||||
|
|
@ -467,7 +472,10 @@ static inline struct tls_context *tls_get_ctx(const struct sock *sk)
|
|||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
return icsk->icsk_ulp_data;
|
||||
/* Use RCU on icsk_ulp_data only for sock diag code,
|
||||
* TLS data path doesn't need rcu_dereference().
|
||||
*/
|
||||
return (__force void *)icsk->icsk_ulp_data;
|
||||
}
|
||||
|
||||
static inline void tls_advance_record_sn(struct sock *sk,
|
||||
|
|
@ -637,7 +645,6 @@ int tls_proccess_cmsg(struct sock *sk, struct msghdr *msg,
|
|||
unsigned char *record_type);
|
||||
void tls_register_device(struct tls_device *device);
|
||||
void tls_unregister_device(struct tls_device *device);
|
||||
int tls_device_decrypted(struct sock *sk, struct sk_buff *skb);
|
||||
int decrypt_skb(struct sock *sk, struct sk_buff *skb,
|
||||
struct scatterlist *sgout);
|
||||
struct sk_buff *tls_encrypt_skb(struct sk_buff *skb);
|
||||
|
|
@ -650,9 +657,40 @@ int tls_sw_fallback_init(struct sock *sk,
|
|||
struct tls_offload_context_tx *offload_ctx,
|
||||
struct tls_crypto_info *crypto_info);
|
||||
|
||||
#ifdef CONFIG_TLS_DEVICE
|
||||
void tls_device_init(void);
|
||||
void tls_device_cleanup(void);
|
||||
int tls_set_device_offload(struct sock *sk, struct tls_context *ctx);
|
||||
void tls_device_free_resources_tx(struct sock *sk);
|
||||
int tls_set_device_offload_rx(struct sock *sk, struct tls_context *ctx);
|
||||
|
||||
void tls_device_offload_cleanup_rx(struct sock *sk);
|
||||
void tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq);
|
||||
int tls_device_decrypted(struct sock *sk, struct sk_buff *skb);
|
||||
#else
|
||||
static inline void tls_device_init(void) {}
|
||||
static inline void tls_device_cleanup(void) {}
|
||||
|
||||
static inline int
|
||||
tls_set_device_offload(struct sock *sk, struct tls_context *ctx)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void tls_device_free_resources_tx(struct sock *sk) {}
|
||||
|
||||
static inline int
|
||||
tls_set_device_offload_rx(struct sock *sk, struct tls_context *ctx)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void tls_device_offload_cleanup_rx(struct sock *sk) {}
|
||||
static inline void
|
||||
tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq) {}
|
||||
|
||||
static inline int tls_device_decrypted(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* _TLS_OFFLOAD_H */
|
||||
|
|
|
|||
|
|
@ -480,7 +480,7 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk,
|
|||
* CB fragment
|
||||
*/
|
||||
segs = __skb_gso_segment(skb, features, false);
|
||||
if (unlikely(IS_ERR_OR_NULL(segs))) {
|
||||
if (IS_ERR_OR_NULL(segs)) {
|
||||
int segs_nr = skb_shinfo(skb)->gso_segs;
|
||||
|
||||
atomic_add(segs_nr, &sk->sk_drops);
|
||||
|
|
|
|||
|
|
@ -391,7 +391,7 @@ static inline bool vxlan_addr_multicast(const union vxlan_addr *ipa)
|
|||
if (ipa->sa.sa_family == AF_INET6)
|
||||
return ipv6_addr_is_multicast(&ipa->sin6.sin6_addr);
|
||||
else
|
||||
return IN_MULTICAST(ntohl(ipa->sin.sin_addr.s_addr));
|
||||
return ipv4_is_multicast(ipa->sin.sin_addr.s_addr);
|
||||
}
|
||||
|
||||
#else /* !IS_ENABLED(CONFIG_IPV6) */
|
||||
|
|
@ -403,7 +403,7 @@ static inline bool vxlan_addr_any(const union vxlan_addr *ipa)
|
|||
|
||||
static inline bool vxlan_addr_multicast(const union vxlan_addr *ipa)
|
||||
{
|
||||
return IN_MULTICAST(ntohl(ipa->sin.sin_addr.s_addr));
|
||||
return ipv4_is_multicast(ipa->sin.sin_addr.s_addr);
|
||||
}
|
||||
|
||||
#endif /* IS_ENABLED(CONFIG_IPV6) */
|
||||
|
|
|
|||
|
|
@ -16,6 +16,13 @@
|
|||
struct net_device;
|
||||
struct xsk_queue;
|
||||
|
||||
/* Masks for xdp_umem_page flags.
|
||||
* The low 12-bits of the addr will be 0 since this is the page address, so we
|
||||
* can use them for flags.
|
||||
*/
|
||||
#define XSK_NEXT_PG_CONTIG_SHIFT 0
|
||||
#define XSK_NEXT_PG_CONTIG_MASK (1ULL << XSK_NEXT_PG_CONTIG_SHIFT)
|
||||
|
||||
struct xdp_umem_page {
|
||||
void *addr;
|
||||
dma_addr_t dma;
|
||||
|
|
@ -27,6 +34,13 @@ struct xdp_umem_fq_reuse {
|
|||
u64 handles[];
|
||||
};
|
||||
|
||||
/* Flags for the umem flags field.
|
||||
*
|
||||
* The NEED_WAKEUP flag is 1 due to the reuse of the flags field for public
|
||||
* flags. See inlude/uapi/include/linux/if_xdp.h.
|
||||
*/
|
||||
#define XDP_UMEM_USES_NEED_WAKEUP (1 << 1)
|
||||
|
||||
struct xdp_umem {
|
||||
struct xsk_queue *fq;
|
||||
struct xsk_queue *cq;
|
||||
|
|
@ -41,15 +55,27 @@ struct xdp_umem {
|
|||
struct work_struct work;
|
||||
struct page **pgs;
|
||||
u32 npgs;
|
||||
u16 queue_id;
|
||||
u8 need_wakeup;
|
||||
u8 flags;
|
||||
int id;
|
||||
struct net_device *dev;
|
||||
struct xdp_umem_fq_reuse *fq_reuse;
|
||||
u16 queue_id;
|
||||
bool zc;
|
||||
spinlock_t xsk_list_lock;
|
||||
struct list_head xsk_list;
|
||||
};
|
||||
|
||||
/* Nodes are linked in the struct xdp_sock map_list field, and used to
|
||||
* track which maps a certain socket reside in.
|
||||
*/
|
||||
struct xsk_map;
|
||||
struct xsk_map_node {
|
||||
struct list_head node;
|
||||
struct xsk_map *map;
|
||||
struct xdp_sock **map_entry;
|
||||
};
|
||||
|
||||
struct xdp_sock {
|
||||
/* struct sock must be the first member of struct xdp_sock */
|
||||
struct sock sk;
|
||||
|
|
@ -75,6 +101,9 @@ struct xdp_sock {
|
|||
/* Protects generic receive. */
|
||||
spinlock_t rx_lock;
|
||||
u64 rx_dropped;
|
||||
struct list_head map_list;
|
||||
/* Protects map_list */
|
||||
spinlock_t map_list_lock;
|
||||
};
|
||||
|
||||
struct xdp_buff;
|
||||
|
|
@ -95,15 +124,47 @@ struct xdp_umem_fq_reuse *xsk_reuseq_swap(struct xdp_umem *umem,
|
|||
struct xdp_umem_fq_reuse *newq);
|
||||
void xsk_reuseq_free(struct xdp_umem_fq_reuse *rq);
|
||||
struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev, u16 queue_id);
|
||||
void xsk_set_rx_need_wakeup(struct xdp_umem *umem);
|
||||
void xsk_set_tx_need_wakeup(struct xdp_umem *umem);
|
||||
void xsk_clear_rx_need_wakeup(struct xdp_umem *umem);
|
||||
void xsk_clear_tx_need_wakeup(struct xdp_umem *umem);
|
||||
bool xsk_umem_uses_need_wakeup(struct xdp_umem *umem);
|
||||
|
||||
void xsk_map_try_sock_delete(struct xsk_map *map, struct xdp_sock *xs,
|
||||
struct xdp_sock **map_entry);
|
||||
int xsk_map_inc(struct xsk_map *map);
|
||||
void xsk_map_put(struct xsk_map *map);
|
||||
|
||||
static inline u64 xsk_umem_extract_addr(u64 addr)
|
||||
{
|
||||
return addr & XSK_UNALIGNED_BUF_ADDR_MASK;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_extract_offset(u64 addr)
|
||||
{
|
||||
return addr >> XSK_UNALIGNED_BUF_OFFSET_SHIFT;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_add_offset_to_addr(u64 addr)
|
||||
{
|
||||
return xsk_umem_extract_addr(addr) + xsk_umem_extract_offset(addr);
|
||||
}
|
||||
|
||||
static inline char *xdp_umem_get_data(struct xdp_umem *umem, u64 addr)
|
||||
{
|
||||
return umem->pages[addr >> PAGE_SHIFT].addr + (addr & (PAGE_SIZE - 1));
|
||||
unsigned long page_addr;
|
||||
|
||||
addr = xsk_umem_add_offset_to_addr(addr);
|
||||
page_addr = (unsigned long)umem->pages[addr >> PAGE_SHIFT].addr;
|
||||
|
||||
return (char *)(page_addr & PAGE_MASK) + (addr & ~PAGE_MASK);
|
||||
}
|
||||
|
||||
static inline dma_addr_t xdp_umem_get_dma(struct xdp_umem *umem, u64 addr)
|
||||
{
|
||||
return umem->pages[addr >> PAGE_SHIFT].dma + (addr & (PAGE_SIZE - 1));
|
||||
addr = xsk_umem_add_offset_to_addr(addr);
|
||||
|
||||
return umem->pages[addr >> PAGE_SHIFT].dma + (addr & ~PAGE_MASK);
|
||||
}
|
||||
|
||||
/* Reuse-queue aware version of FILL queue helpers */
|
||||
|
|
@ -144,6 +205,19 @@ static inline void xsk_umem_fq_reuse(struct xdp_umem *umem, u64 addr)
|
|||
|
||||
rq->handles[rq->length++] = addr;
|
||||
}
|
||||
|
||||
/* Handle the offset appropriately depending on aligned or unaligned mode.
|
||||
* For unaligned mode, we store the offset in the upper 16-bits of the address.
|
||||
* For aligned mode, we simply add the offset to the address.
|
||||
*/
|
||||
static inline u64 xsk_umem_adjust_offset(struct xdp_umem *umem, u64 address,
|
||||
u64 offset)
|
||||
{
|
||||
if (umem->flags & XDP_UMEM_UNALIGNED_CHUNK_FLAG)
|
||||
return address + (offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT);
|
||||
else
|
||||
return address + offset;
|
||||
}
|
||||
#else
|
||||
static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
|
||||
{
|
||||
|
|
@ -213,6 +287,21 @@ static inline struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_extract_addr(u64 addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_extract_offset(u64 addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_add_offset_to_addr(u64 addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline char *xdp_umem_get_data(struct xdp_umem *umem, u64 addr)
|
||||
{
|
||||
return NULL;
|
||||
|
|
@ -241,6 +330,33 @@ static inline void xsk_umem_fq_reuse(struct xdp_umem *umem, u64 addr)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void xsk_set_rx_need_wakeup(struct xdp_umem *umem)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xsk_set_tx_need_wakeup(struct xdp_umem *umem)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xsk_clear_rx_need_wakeup(struct xdp_umem *umem)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xsk_clear_tx_need_wakeup(struct xdp_umem *umem)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool xsk_umem_uses_need_wakeup(struct xdp_umem *umem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u64 xsk_umem_adjust_offset(struct xdp_umem *umem, u64 handle,
|
||||
u64 offset)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_XDP_SOCKETS */
|
||||
|
||||
#endif /* _LINUX_XDP_SOCK_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue