mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 17:57:38 -04:00
Merge remote-tracking branch 'net-next/master' into mac80211-next
Merge net-next to resolve a conflict and to get the mac80211 rhashtable fixes so further patches can be applied on top. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -80,7 +80,7 @@ static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
|
||||
struct tc_action_ops {
|
||||
struct list_head head;
|
||||
char kind[IFNAMSIZ];
|
||||
__u32 type; /* TBD to match kind */
|
||||
enum tca_id id; /* identifier should match kind */
|
||||
size_t size;
|
||||
struct module *owner;
|
||||
int (*act)(struct sk_buff *, const struct tc_action *,
|
||||
|
||||
@@ -248,6 +248,7 @@ struct ipv6_stub {
|
||||
const struct in6_addr *addr);
|
||||
int (*ipv6_dst_lookup)(struct net *net, struct sock *sk,
|
||||
struct dst_entry **dst, struct flowi6 *fl6);
|
||||
int (*ipv6_route_input)(struct sk_buff *skb);
|
||||
|
||||
struct fib6_table *(*fib6_get_table)(struct net *net, u32 id);
|
||||
struct fib6_info *(*fib6_lookup)(struct net *net, int oif,
|
||||
|
||||
@@ -30,6 +30,7 @@ struct devlink {
|
||||
struct list_head param_list;
|
||||
struct list_head region_list;
|
||||
u32 snapshot_id;
|
||||
struct list_head reporter_list;
|
||||
struct devlink_dpipe_headers *dpipe_headers;
|
||||
const struct devlink_ops *ops;
|
||||
struct device *dev;
|
||||
@@ -357,6 +358,7 @@ struct devlink_param_item {
|
||||
const struct devlink_param *param;
|
||||
union devlink_param_value driverinit_value;
|
||||
bool driverinit_value_valid;
|
||||
bool published;
|
||||
};
|
||||
|
||||
enum devlink_param_generic_id {
|
||||
@@ -368,17 +370,12 @@ 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_WOL,
|
||||
|
||||
/* add new param generic ids above here*/
|
||||
__DEVLINK_PARAM_GENERIC_ID_MAX,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX = __DEVLINK_PARAM_GENERIC_ID_MAX - 1,
|
||||
};
|
||||
|
||||
enum devlink_param_wol_types {
|
||||
DEVLINK_PARAM_WAKE_MAGIC = (1 << 0),
|
||||
};
|
||||
|
||||
#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_NAME "internal_error_reset"
|
||||
#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
|
||||
|
||||
@@ -403,9 +400,6 @@ enum devlink_param_wol_types {
|
||||
#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_WOL_NAME "wake_on_lan"
|
||||
#define DEVLINK_PARAM_GENERIC_WOL_TYPE DEVLINK_PARAM_TYPE_U8
|
||||
|
||||
#define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate) \
|
||||
{ \
|
||||
.id = DEVLINK_PARAM_GENERIC_ID_##_id, \
|
||||
@@ -433,6 +427,8 @@ enum devlink_param_wol_types {
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_BOARD_ID "board.id"
|
||||
/* Revision of board design */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_BOARD_REV "board.rev"
|
||||
/* Maker of the board */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE "board.manufacture"
|
||||
|
||||
/* Control processor FW version */
|
||||
#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt"
|
||||
@@ -448,6 +444,29 @@ struct devlink_info_req;
|
||||
|
||||
typedef void devlink_snapshot_data_dest_t(const void *data);
|
||||
|
||||
struct devlink_fmsg;
|
||||
struct devlink_health_reporter;
|
||||
|
||||
/**
|
||||
* struct devlink_health_reporter_ops - Reporter operations
|
||||
* @name: reporter name
|
||||
* @recover: callback to recover from reported error
|
||||
* if priv_ctx is NULL, run a full recover
|
||||
* @dump: callback to dump an object
|
||||
* if priv_ctx is NULL, run a full dump
|
||||
* @diagnose: callback to diagnose the current status
|
||||
*/
|
||||
|
||||
struct devlink_health_reporter_ops {
|
||||
char *name;
|
||||
int (*recover)(struct devlink_health_reporter *reporter,
|
||||
void *priv_ctx);
|
||||
int (*dump)(struct devlink_health_reporter *reporter,
|
||||
struct devlink_fmsg *fmsg, void *priv_ctx);
|
||||
int (*diagnose)(struct devlink_health_reporter *reporter,
|
||||
struct devlink_fmsg *fmsg);
|
||||
};
|
||||
|
||||
struct devlink_ops {
|
||||
int (*reload)(struct devlink *devlink, struct netlink_ext_ack *extack);
|
||||
int (*port_type_set)(struct devlink_port *devlink_port,
|
||||
@@ -502,6 +521,9 @@ struct devlink_ops {
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*info_get)(struct devlink *devlink, struct devlink_info_req *req,
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*flash_update)(struct devlink *devlink, const char *file_name,
|
||||
const char *component,
|
||||
struct netlink_ext_ack *extack);
|
||||
};
|
||||
|
||||
static inline void *devlink_priv(struct devlink *devlink)
|
||||
@@ -594,6 +616,8 @@ int devlink_params_register(struct devlink *devlink,
|
||||
void devlink_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
void devlink_params_publish(struct devlink *devlink);
|
||||
void devlink_params_unpublish(struct devlink *devlink);
|
||||
int devlink_port_params_register(struct devlink_port *devlink_port,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
@@ -639,6 +663,50 @@ int devlink_info_version_running_put(struct devlink_info_req *req,
|
||||
const char *version_name,
|
||||
const char *version_value);
|
||||
|
||||
int devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg);
|
||||
int devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg);
|
||||
|
||||
int devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name);
|
||||
int devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg);
|
||||
|
||||
int devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
|
||||
const char *name);
|
||||
int devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg);
|
||||
|
||||
int devlink_fmsg_bool_put(struct devlink_fmsg *fmsg, bool value);
|
||||
int devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value);
|
||||
int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value);
|
||||
int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value);
|
||||
int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value);
|
||||
int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
|
||||
u16 value_len);
|
||||
|
||||
int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
bool value);
|
||||
int devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u8 value);
|
||||
int devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u32 value);
|
||||
int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u64 value);
|
||||
int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
const char *value);
|
||||
int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
const void *value, u16 value_len);
|
||||
|
||||
struct devlink_health_reporter *
|
||||
devlink_health_reporter_create(struct devlink *devlink,
|
||||
const struct devlink_health_reporter_ops *ops,
|
||||
u64 graceful_period, bool auto_recover,
|
||||
void *priv);
|
||||
void
|
||||
devlink_health_reporter_destroy(struct devlink_health_reporter *reporter);
|
||||
|
||||
void *
|
||||
devlink_health_reporter_priv(struct devlink_health_reporter *reporter);
|
||||
int devlink_health_report(struct devlink_health_reporter *reporter,
|
||||
const char *msg, void *priv_ctx);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
|
||||
@@ -656,6 +724,14 @@ static inline void devlink_unregister(struct devlink *devlink)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devlink_params_publish(struct devlink *devlink)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devlink_params_unpublish(struct devlink *devlink)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devlink_free(struct devlink *devlink)
|
||||
{
|
||||
kfree(devlink);
|
||||
@@ -971,16 +1047,166 @@ devlink_info_version_running_put(struct devlink_info_req *req,
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
|
||||
const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_bool_put(struct devlink_fmsg *fmsg, bool value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
|
||||
u16 value_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
bool value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u8 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u32 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
u64 value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
const char *value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
|
||||
const void *value, u16 value_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct devlink_health_reporter *
|
||||
devlink_health_reporter_create(struct devlink *devlink,
|
||||
const struct devlink_health_reporter_ops *ops,
|
||||
u64 graceful_period, bool auto_recover,
|
||||
void *priv)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void *
|
||||
devlink_health_reporter_priv(struct devlink_health_reporter *reporter)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_health_report(struct devlink_health_reporter *reporter,
|
||||
const char *msg, void *priv_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_REACHABLE(CONFIG_NET_DEVLINK)
|
||||
void devlink_compat_running_version(struct net_device *dev,
|
||||
char *buf, size_t len);
|
||||
int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
|
||||
#else
|
||||
static inline void
|
||||
devlink_compat_running_version(struct net_device *dev, char *buf, size_t len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_compat_flash_update(struct net_device *dev, const char *file_name)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NET_DEVLINK_H_ */
|
||||
|
||||
@@ -400,6 +400,8 @@ struct dsa_switch_ops {
|
||||
void (*port_stp_state_set)(struct dsa_switch *ds, int port,
|
||||
u8 state);
|
||||
void (*port_fast_age)(struct dsa_switch *ds, int port);
|
||||
int (*port_egress_floods)(struct dsa_switch *ds, int port,
|
||||
bool unicast, bool multicast);
|
||||
|
||||
/*
|
||||
* VLAN support
|
||||
|
||||
203
include/net/flow_offload.h
Normal file
203
include/net/flow_offload.h
Normal file
@@ -0,0 +1,203 @@
|
||||
#ifndef _NET_FLOW_OFFLOAD_H
|
||||
#define _NET_FLOW_OFFLOAD_H
|
||||
|
||||
#include <net/flow_dissector.h>
|
||||
|
||||
struct flow_match {
|
||||
struct flow_dissector *dissector;
|
||||
void *mask;
|
||||
void *key;
|
||||
};
|
||||
|
||||
struct flow_match_basic {
|
||||
struct flow_dissector_key_basic *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_control {
|
||||
struct flow_dissector_key_control *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_eth_addrs {
|
||||
struct flow_dissector_key_eth_addrs *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_vlan {
|
||||
struct flow_dissector_key_vlan *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_ipv4_addrs {
|
||||
struct flow_dissector_key_ipv4_addrs *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_ipv6_addrs {
|
||||
struct flow_dissector_key_ipv6_addrs *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_ip {
|
||||
struct flow_dissector_key_ip *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_ports {
|
||||
struct flow_dissector_key_ports *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_icmp {
|
||||
struct flow_dissector_key_icmp *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_tcp {
|
||||
struct flow_dissector_key_tcp *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_mpls {
|
||||
struct flow_dissector_key_mpls *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_enc_keyid {
|
||||
struct flow_dissector_key_keyid *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_match_enc_opts {
|
||||
struct flow_dissector_key_enc_opts *key, *mask;
|
||||
};
|
||||
|
||||
struct flow_rule;
|
||||
|
||||
void flow_rule_match_basic(const struct flow_rule *rule,
|
||||
struct flow_match_basic *out);
|
||||
void flow_rule_match_control(const struct flow_rule *rule,
|
||||
struct flow_match_control *out);
|
||||
void flow_rule_match_eth_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_eth_addrs *out);
|
||||
void flow_rule_match_vlan(const struct flow_rule *rule,
|
||||
struct flow_match_vlan *out);
|
||||
void flow_rule_match_ipv4_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv4_addrs *out);
|
||||
void flow_rule_match_ipv6_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv6_addrs *out);
|
||||
void flow_rule_match_ip(const struct flow_rule *rule,
|
||||
struct flow_match_ip *out);
|
||||
void flow_rule_match_ports(const struct flow_rule *rule,
|
||||
struct flow_match_ports *out);
|
||||
void flow_rule_match_tcp(const struct flow_rule *rule,
|
||||
struct flow_match_tcp *out);
|
||||
void flow_rule_match_icmp(const struct flow_rule *rule,
|
||||
struct flow_match_icmp *out);
|
||||
void flow_rule_match_mpls(const struct flow_rule *rule,
|
||||
struct flow_match_mpls *out);
|
||||
void flow_rule_match_enc_control(const struct flow_rule *rule,
|
||||
struct flow_match_control *out);
|
||||
void flow_rule_match_enc_ipv4_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv4_addrs *out);
|
||||
void flow_rule_match_enc_ipv6_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv6_addrs *out);
|
||||
void flow_rule_match_enc_ip(const struct flow_rule *rule,
|
||||
struct flow_match_ip *out);
|
||||
void flow_rule_match_enc_ports(const struct flow_rule *rule,
|
||||
struct flow_match_ports *out);
|
||||
void flow_rule_match_enc_keyid(const struct flow_rule *rule,
|
||||
struct flow_match_enc_keyid *out);
|
||||
void flow_rule_match_enc_opts(const struct flow_rule *rule,
|
||||
struct flow_match_enc_opts *out);
|
||||
|
||||
enum flow_action_id {
|
||||
FLOW_ACTION_ACCEPT = 0,
|
||||
FLOW_ACTION_DROP,
|
||||
FLOW_ACTION_TRAP,
|
||||
FLOW_ACTION_GOTO,
|
||||
FLOW_ACTION_REDIRECT,
|
||||
FLOW_ACTION_MIRRED,
|
||||
FLOW_ACTION_VLAN_PUSH,
|
||||
FLOW_ACTION_VLAN_POP,
|
||||
FLOW_ACTION_VLAN_MANGLE,
|
||||
FLOW_ACTION_TUNNEL_ENCAP,
|
||||
FLOW_ACTION_TUNNEL_DECAP,
|
||||
FLOW_ACTION_MANGLE,
|
||||
FLOW_ACTION_ADD,
|
||||
FLOW_ACTION_CSUM,
|
||||
FLOW_ACTION_MARK,
|
||||
FLOW_ACTION_WAKE,
|
||||
FLOW_ACTION_QUEUE,
|
||||
};
|
||||
|
||||
/* This is mirroring enum pedit_header_type definition for easy mapping between
|
||||
* tc pedit action. Legacy TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK is mapped to
|
||||
* FLOW_ACT_MANGLE_UNSPEC, which is supported by no driver.
|
||||
*/
|
||||
enum flow_action_mangle_base {
|
||||
FLOW_ACT_MANGLE_UNSPEC = 0,
|
||||
FLOW_ACT_MANGLE_HDR_TYPE_ETH,
|
||||
FLOW_ACT_MANGLE_HDR_TYPE_IP4,
|
||||
FLOW_ACT_MANGLE_HDR_TYPE_IP6,
|
||||
FLOW_ACT_MANGLE_HDR_TYPE_TCP,
|
||||
FLOW_ACT_MANGLE_HDR_TYPE_UDP,
|
||||
};
|
||||
|
||||
struct flow_action_entry {
|
||||
enum flow_action_id id;
|
||||
union {
|
||||
u32 chain_index; /* FLOW_ACTION_GOTO */
|
||||
struct net_device *dev; /* FLOW_ACTION_REDIRECT */
|
||||
struct { /* FLOW_ACTION_VLAN */
|
||||
u16 vid;
|
||||
__be16 proto;
|
||||
u8 prio;
|
||||
} vlan;
|
||||
struct { /* FLOW_ACTION_PACKET_EDIT */
|
||||
enum flow_action_mangle_base htype;
|
||||
u32 offset;
|
||||
u32 mask;
|
||||
u32 val;
|
||||
} mangle;
|
||||
const struct ip_tunnel_info *tunnel; /* FLOW_ACTION_TUNNEL_ENCAP */
|
||||
u32 csum_flags; /* FLOW_ACTION_CSUM */
|
||||
u32 mark; /* FLOW_ACTION_MARK */
|
||||
struct { /* FLOW_ACTION_QUEUE */
|
||||
u32 ctx;
|
||||
u32 index;
|
||||
u8 vf;
|
||||
} queue;
|
||||
};
|
||||
};
|
||||
|
||||
struct flow_action {
|
||||
unsigned int num_entries;
|
||||
struct flow_action_entry entries[0];
|
||||
};
|
||||
|
||||
static inline bool flow_action_has_entries(const struct flow_action *action)
|
||||
{
|
||||
return action->num_entries;
|
||||
}
|
||||
|
||||
#define flow_action_for_each(__i, __act, __actions) \
|
||||
for (__i = 0, __act = &(__actions)->entries[0]; __i < (__actions)->num_entries; __act = &(__actions)->entries[++__i])
|
||||
|
||||
struct flow_rule {
|
||||
struct flow_match match;
|
||||
struct flow_action action;
|
||||
};
|
||||
|
||||
struct flow_rule *flow_rule_alloc(unsigned int num_actions);
|
||||
|
||||
static inline bool flow_rule_match_key(const struct flow_rule *rule,
|
||||
enum flow_dissector_key_id key)
|
||||
{
|
||||
return dissector_uses_key(rule->match.dissector, key);
|
||||
}
|
||||
|
||||
struct flow_stats {
|
||||
u64 pkts;
|
||||
u64 bytes;
|
||||
u64 lastused;
|
||||
};
|
||||
|
||||
static inline void flow_stats_update(struct flow_stats *flow_stats,
|
||||
u64 bytes, u64 pkts, u64 lastused)
|
||||
{
|
||||
flow_stats->pkts += pkts;
|
||||
flow_stats->bytes += bytes;
|
||||
flow_stats->lastused = max_t(u64, flow_stats->lastused, lastused);
|
||||
}
|
||||
|
||||
#endif /* _NET_FLOW_OFFLOAD_H */
|
||||
@@ -39,6 +39,7 @@ struct inet_peer {
|
||||
|
||||
u32 metrics[RTAX_MAX];
|
||||
u32 rate_tokens; /* rate limiting for ICMP */
|
||||
u32 n_redirects;
|
||||
unsigned long rate_last;
|
||||
/*
|
||||
* Once inet_peer is queued for deletion (refcnt == 0), following field
|
||||
|
||||
@@ -153,7 +153,8 @@ struct sk_buff *l3mdev_l3_rcv(struct sk_buff *skb, u16 proto)
|
||||
|
||||
if (netif_is_l3_slave(skb->dev))
|
||||
master = netdev_master_upper_dev_get_rcu(skb->dev);
|
||||
else if (netif_is_l3_master(skb->dev))
|
||||
else if (netif_is_l3_master(skb->dev) ||
|
||||
netif_has_l3_rx_handler(skb->dev))
|
||||
master = skb->dev;
|
||||
|
||||
if (master && master->l3mdev_ops->l3mdev_l3_rcv)
|
||||
|
||||
@@ -126,6 +126,8 @@ int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
|
||||
int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int lwtunnel_input(struct sk_buff *skb);
|
||||
int lwtunnel_xmit(struct sk_buff *skb);
|
||||
int bpf_lwt_push_ip_encap(struct sk_buff *skb, void *hdr, u32 len,
|
||||
bool ingress);
|
||||
|
||||
static inline void lwtunnel_set_redirect(struct dst_entry *dst)
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/icmp.h>
|
||||
#include <net/netfilter/nf_reject.h>
|
||||
|
||||
void nf_send_unreach(struct sk_buff *skb_in, int code, int hook);
|
||||
void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#define _IPV6_NF_REJECT_H
|
||||
|
||||
#include <linux/icmpv6.h>
|
||||
#include <net/netfilter/nf_reject.h>
|
||||
|
||||
void nf_send_unreach6(struct net *net, struct sk_buff *skb_in, unsigned char code,
|
||||
unsigned int hooknum);
|
||||
|
||||
27
include/net/netfilter/nf_reject.h
Normal file
27
include/net/netfilter/nf_reject.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _NF_REJECT_H
|
||||
#define _NF_REJECT_H
|
||||
|
||||
static inline bool nf_reject_verify_csum(__u8 proto)
|
||||
{
|
||||
/* Skip protocols that don't use 16-bit one's complement checksum
|
||||
* of the entire payload.
|
||||
*/
|
||||
switch (proto) {
|
||||
/* Protocols with other integrity checks. */
|
||||
case IPPROTO_AH:
|
||||
case IPPROTO_ESP:
|
||||
case IPPROTO_SCTP:
|
||||
|
||||
/* Protocols with partial checksums. */
|
||||
case IPPROTO_UDPLITE:
|
||||
case IPPROTO_DCCP:
|
||||
|
||||
/* Protocols with optional checksums. */
|
||||
case IPPROTO_GRE:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* _NF_REJECT_H */
|
||||
@@ -469,9 +469,7 @@ struct nft_set_binding {
|
||||
int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
struct nft_set_binding *binding);
|
||||
void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
struct nft_set_binding *binding);
|
||||
void nf_tables_rebind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
struct nft_set_binding *binding);
|
||||
struct nft_set_binding *binding, bool commit);
|
||||
void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set);
|
||||
|
||||
/**
|
||||
@@ -721,6 +719,13 @@ struct nft_expr_type {
|
||||
#define NFT_EXPR_STATEFUL 0x1
|
||||
#define NFT_EXPR_GC 0x2
|
||||
|
||||
enum nft_trans_phase {
|
||||
NFT_TRANS_PREPARE,
|
||||
NFT_TRANS_ABORT,
|
||||
NFT_TRANS_COMMIT,
|
||||
NFT_TRANS_RELEASE
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nft_expr_ops - nf_tables expression operations
|
||||
*
|
||||
@@ -750,7 +755,8 @@ struct nft_expr_ops {
|
||||
void (*activate)(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr);
|
||||
void (*deactivate)(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr);
|
||||
const struct nft_expr *expr,
|
||||
enum nft_trans_phase phase);
|
||||
void (*destroy)(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr);
|
||||
void (*destroy_clone)(const struct nft_ctx *ctx,
|
||||
@@ -1335,12 +1341,15 @@ struct nft_trans_rule {
|
||||
struct nft_trans_set {
|
||||
struct nft_set *set;
|
||||
u32 set_id;
|
||||
bool bound;
|
||||
};
|
||||
|
||||
#define nft_trans_set(trans) \
|
||||
(((struct nft_trans_set *)trans->data)->set)
|
||||
#define nft_trans_set_id(trans) \
|
||||
(((struct nft_trans_set *)trans->data)->set_id)
|
||||
#define nft_trans_set_bound(trans) \
|
||||
(((struct nft_trans_set *)trans->data)->bound)
|
||||
|
||||
struct nft_trans_chain {
|
||||
bool update;
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/sch_generic.h>
|
||||
#include <net/act_api.h>
|
||||
#include <net/flow_offload.h>
|
||||
|
||||
/* TC action not accessible from user space */
|
||||
#define TC_ACT_REINSERT (TC_ACT_VALUE_MAX + 1)
|
||||
@@ -43,6 +44,10 @@ bool tcf_queue_work(struct rcu_work *rwork, work_func_t func);
|
||||
struct tcf_chain *tcf_chain_get_by_act(struct tcf_block *block,
|
||||
u32 chain_index);
|
||||
void tcf_chain_put_by_act(struct tcf_chain *chain);
|
||||
struct tcf_chain *tcf_get_next_chain(struct tcf_block *block,
|
||||
struct tcf_chain *chain);
|
||||
struct tcf_proto *tcf_get_next_proto(struct tcf_chain *chain,
|
||||
struct tcf_proto *tp, bool rtnl_held);
|
||||
void tcf_block_netif_keep_dst(struct tcf_block *block);
|
||||
int tcf_block_get(struct tcf_block **p_block,
|
||||
struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
|
||||
@@ -411,7 +416,7 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
|
||||
|
||||
int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
|
||||
struct nlattr **tb, struct nlattr *rate_tlv,
|
||||
struct tcf_exts *exts, bool ovr,
|
||||
struct tcf_exts *exts, bool ovr, bool rtnl_held,
|
||||
struct netlink_ext_ack *extack);
|
||||
void tcf_exts_destroy(struct tcf_exts *exts);
|
||||
void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
|
||||
@@ -619,8 +624,11 @@ tcf_match_indev(struct sk_buff *skb, int ifindex)
|
||||
}
|
||||
#endif /* CONFIG_NET_CLS_IND */
|
||||
|
||||
int tc_setup_flow_action(struct flow_action *flow_action,
|
||||
const struct tcf_exts *exts);
|
||||
int tc_setup_cb_call(struct tcf_block *block, enum tc_setup_type type,
|
||||
void *type_data, bool err_stop);
|
||||
unsigned int tcf_exts_num_actions(struct tcf_exts *exts);
|
||||
|
||||
enum tc_block_command {
|
||||
TC_BLOCK_BIND,
|
||||
@@ -760,13 +768,17 @@ struct tc_cls_flower_offload {
|
||||
struct tc_cls_common_offload common;
|
||||
enum tc_fl_command command;
|
||||
unsigned long cookie;
|
||||
struct flow_dissector *dissector;
|
||||
struct fl_flow_key *mask;
|
||||
struct fl_flow_key *key;
|
||||
struct tcf_exts *exts;
|
||||
struct flow_rule *rule;
|
||||
struct flow_stats stats;
|
||||
u32 classid;
|
||||
};
|
||||
|
||||
static inline struct flow_rule *
|
||||
tc_cls_flower_offload_flow_rule(struct tc_cls_flower_offload *tc_flow_cmd)
|
||||
{
|
||||
return tc_flow_cmd->rule;
|
||||
}
|
||||
|
||||
enum tc_matchall_command {
|
||||
TC_CLSMATCHALL_REPLACE,
|
||||
TC_CLSMATCHALL_DESTROY,
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <net/gen_stats.h>
|
||||
#include <net/rtnetlink.h>
|
||||
|
||||
@@ -178,6 +179,7 @@ static inline int qdisc_avail_bulklimit(const struct netdev_queue *txq)
|
||||
}
|
||||
|
||||
struct Qdisc_class_ops {
|
||||
unsigned int flags;
|
||||
/* Child qdisc manipulation */
|
||||
struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *);
|
||||
int (*graft)(struct Qdisc *, unsigned long cl,
|
||||
@@ -209,6 +211,13 @@ struct Qdisc_class_ops {
|
||||
struct gnet_dump *);
|
||||
};
|
||||
|
||||
/* Qdisc_class_ops flag values */
|
||||
|
||||
/* Implements API that doesn't require rtnl lock */
|
||||
enum qdisc_class_ops_flags {
|
||||
QDISC_CLASS_OPS_DOIT_UNLOCKED = 1,
|
||||
};
|
||||
|
||||
struct Qdisc_ops {
|
||||
struct Qdisc_ops *next;
|
||||
const struct Qdisc_class_ops *cl_ops;
|
||||
@@ -272,19 +281,21 @@ struct tcf_proto_ops {
|
||||
const struct tcf_proto *,
|
||||
struct tcf_result *);
|
||||
int (*init)(struct tcf_proto*);
|
||||
void (*destroy)(struct tcf_proto *tp,
|
||||
void (*destroy)(struct tcf_proto *tp, bool rtnl_held,
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
void* (*get)(struct tcf_proto*, u32 handle);
|
||||
void (*put)(struct tcf_proto *tp, void *f);
|
||||
int (*change)(struct net *net, struct sk_buff *,
|
||||
struct tcf_proto*, unsigned long,
|
||||
u32 handle, struct nlattr **,
|
||||
void **, bool,
|
||||
void **, bool, bool,
|
||||
struct netlink_ext_ack *);
|
||||
int (*delete)(struct tcf_proto *tp, void *arg,
|
||||
bool *last,
|
||||
bool *last, bool rtnl_held,
|
||||
struct netlink_ext_ack *);
|
||||
void (*walk)(struct tcf_proto*, struct tcf_walker *arg);
|
||||
void (*walk)(struct tcf_proto *tp,
|
||||
struct tcf_walker *arg, bool rtnl_held);
|
||||
int (*reoffload)(struct tcf_proto *tp, bool add,
|
||||
tc_setup_cb_t *cb, void *cb_priv,
|
||||
struct netlink_ext_ack *extack);
|
||||
@@ -297,12 +308,18 @@ struct tcf_proto_ops {
|
||||
|
||||
/* rtnetlink specific */
|
||||
int (*dump)(struct net*, struct tcf_proto*, void *,
|
||||
struct sk_buff *skb, struct tcmsg*);
|
||||
struct sk_buff *skb, struct tcmsg*,
|
||||
bool);
|
||||
int (*tmplt_dump)(struct sk_buff *skb,
|
||||
struct net *net,
|
||||
void *tmplt_priv);
|
||||
|
||||
struct module *owner;
|
||||
int flags;
|
||||
};
|
||||
|
||||
enum tcf_proto_ops_flags {
|
||||
TCF_PROTO_OPS_DOIT_UNLOCKED = 1,
|
||||
};
|
||||
|
||||
struct tcf_proto {
|
||||
@@ -321,6 +338,12 @@ struct tcf_proto {
|
||||
void *data;
|
||||
const struct tcf_proto_ops *ops;
|
||||
struct tcf_chain *chain;
|
||||
/* Lock protects tcf_proto shared state and can be used by unlocked
|
||||
* classifiers to protect their private data.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
bool deleting;
|
||||
refcount_t refcnt;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
@@ -340,6 +363,8 @@ struct qdisc_skb_cb {
|
||||
typedef void tcf_chain_head_change_t(struct tcf_proto *tp_head, void *priv);
|
||||
|
||||
struct tcf_chain {
|
||||
/* Protects filter_chain. */
|
||||
struct mutex filter_chain_lock;
|
||||
struct tcf_proto __rcu *filter_chain;
|
||||
struct list_head list;
|
||||
struct tcf_block *block;
|
||||
@@ -347,11 +372,16 @@ struct tcf_chain {
|
||||
unsigned int refcnt;
|
||||
unsigned int action_refcnt;
|
||||
bool explicitly_created;
|
||||
bool flushing;
|
||||
const struct tcf_proto_ops *tmplt_ops;
|
||||
void *tmplt_priv;
|
||||
};
|
||||
|
||||
struct tcf_block {
|
||||
/* Lock protects tcf_block and lifetime-management data of chains
|
||||
* attached to the block (refcnt, action_refcnt, explicitly_created).
|
||||
*/
|
||||
struct mutex lock;
|
||||
struct list_head chain_list;
|
||||
u32 index; /* block index for shared blocks */
|
||||
refcount_t refcnt;
|
||||
@@ -369,6 +399,34 @@ struct tcf_block {
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
static inline bool lockdep_tcf_chain_is_locked(struct tcf_chain *chain)
|
||||
{
|
||||
return lockdep_is_held(&chain->filter_chain_lock);
|
||||
}
|
||||
|
||||
static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
|
||||
{
|
||||
return lockdep_is_held(&tp->lock);
|
||||
}
|
||||
#else
|
||||
static inline bool lockdep_tcf_chain_is_locked(struct tcf_block *chain)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool lockdep_tcf_proto_is_locked(struct tcf_proto *tp)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif /* #ifdef CONFIG_PROVE_LOCKING */
|
||||
|
||||
#define tcf_chain_dereference(p, chain) \
|
||||
rcu_dereference_protected(p, lockdep_tcf_chain_is_locked(chain))
|
||||
|
||||
#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)
|
||||
|
||||
@@ -74,6 +74,7 @@ struct smcd_dev {
|
||||
struct list_head vlan;
|
||||
struct workqueue_struct *event_wq;
|
||||
u8 pnetid[SMC_MAX_PNETID_LEN];
|
||||
bool pnetid_by_user;
|
||||
};
|
||||
|
||||
struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
|
||||
|
||||
@@ -1278,7 +1278,7 @@ static inline void sk_sockets_allocated_inc(struct sock *sk)
|
||||
percpu_counter_inc(sk->sk_prot->sockets_allocated);
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline u64
|
||||
sk_sockets_allocated_read_positive(struct sock *sk)
|
||||
{
|
||||
return percpu_counter_read_positive(sk->sk_prot->sockets_allocated);
|
||||
|
||||
@@ -43,10 +43,9 @@ static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)
|
||||
|
||||
enum switchdev_attr_id {
|
||||
SWITCHDEV_ATTR_ID_UNDEFINED,
|
||||
SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
|
||||
SWITCHDEV_ATTR_ID_PORT_STP_STATE,
|
||||
SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
|
||||
SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT,
|
||||
SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
|
||||
SWITCHDEV_ATTR_ID_PORT_MROUTER,
|
||||
SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
|
||||
SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
|
||||
@@ -61,10 +60,8 @@ struct switchdev_attr {
|
||||
void *complete_priv;
|
||||
void (*complete)(struct net_device *dev, int err, void *priv);
|
||||
union {
|
||||
struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
|
||||
u8 stp_state; /* PORT_STP_STATE */
|
||||
unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */
|
||||
unsigned long brport_flags_support; /* PORT_BRIDGE_FLAGS_SUPPORT */
|
||||
unsigned long brport_flags; /* PORT_{PRE}_BRIDGE_FLAGS */
|
||||
bool mrouter; /* PORT_MROUTER */
|
||||
clock_t ageing_time; /* BRIDGE_AGEING_TIME */
|
||||
bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */
|
||||
@@ -182,8 +179,6 @@ switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
|
||||
#ifdef CONFIG_NET_SWITCHDEV
|
||||
|
||||
void switchdev_deferred_process(void);
|
||||
int switchdev_port_attr_get(struct net_device *dev,
|
||||
struct switchdev_attr *attr);
|
||||
int switchdev_port_attr_set(struct net_device *dev,
|
||||
const struct switchdev_attr *attr);
|
||||
int switchdev_port_obj_add(struct net_device *dev,
|
||||
@@ -208,9 +203,6 @@ void switchdev_port_fwd_mark_set(struct net_device *dev,
|
||||
struct net_device *group_dev,
|
||||
bool joining);
|
||||
|
||||
bool switchdev_port_same_parent_id(struct net_device *a,
|
||||
struct net_device *b);
|
||||
|
||||
int switchdev_handle_port_obj_add(struct net_device *dev,
|
||||
struct switchdev_notifier_port_obj_info *port_obj_info,
|
||||
bool (*check_cb)(const struct net_device *dev),
|
||||
@@ -231,12 +223,6 @@ static inline void switchdev_deferred_process(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int switchdev_port_attr_get(struct net_device *dev,
|
||||
struct switchdev_attr *attr)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int switchdev_port_attr_set(struct net_device *dev,
|
||||
const struct switchdev_attr *attr)
|
||||
{
|
||||
@@ -295,12 +281,6 @@ call_switchdev_blocking_notifiers(unsigned long val,
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static inline bool switchdev_port_same_parent_id(struct net_device *a,
|
||||
struct net_device *b)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int
|
||||
switchdev_handle_port_obj_add(struct net_device *dev,
|
||||
struct switchdev_notifier_port_obj_info *port_obj_info,
|
||||
|
||||
@@ -21,7 +21,7 @@ struct tcf_csum {
|
||||
static inline bool is_tcf_csum(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_CSUM)
|
||||
if (a->ops && a->ops->id == TCA_ID_CSUM)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
@@ -22,7 +22,7 @@ static inline bool __is_tcf_gact_act(const struct tc_action *a, int act,
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
struct tcf_gact *gact;
|
||||
|
||||
if (a->ops && a->ops->type != TCA_ACT_GACT)
|
||||
if (a->ops && a->ops->id != TCA_ID_GACT)
|
||||
return false;
|
||||
|
||||
gact = to_gact(a);
|
||||
|
||||
@@ -17,7 +17,7 @@ struct tcf_mirred {
|
||||
static inline bool is_tcf_mirred_egress_redirect(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_MIRRED)
|
||||
if (a->ops && a->ops->id == TCA_ID_MIRRED)
|
||||
return to_mirred(a)->tcfm_eaction == TCA_EGRESS_REDIR;
|
||||
#endif
|
||||
return false;
|
||||
@@ -26,7 +26,7 @@ static inline bool is_tcf_mirred_egress_redirect(const struct tc_action *a)
|
||||
static inline bool is_tcf_mirred_egress_mirror(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_MIRRED)
|
||||
if (a->ops && a->ops->id == TCA_ID_MIRRED)
|
||||
return to_mirred(a)->tcfm_eaction == TCA_EGRESS_MIRROR;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
@@ -23,7 +23,7 @@ struct tcf_pedit {
|
||||
static inline bool is_tcf_pedit(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_PEDIT)
|
||||
if (a->ops && a->ops->id == TCA_ID_PEDIT)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
@@ -20,7 +20,7 @@ struct tcf_sample {
|
||||
static inline bool is_tcf_sample(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
return a->ops && a->ops->type == TCA_ACT_SAMPLE;
|
||||
return a->ops && a->ops->id == TCA_ID_SAMPLE;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
|
||||
@@ -44,7 +44,7 @@ static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
u32 flags;
|
||||
|
||||
if (a->ops && a->ops->type == TCA_ACT_SKBEDIT) {
|
||||
if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
|
||||
rcu_read_lock();
|
||||
flags = rcu_dereference(to_skbedit(a)->params)->flags;
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -34,7 +34,7 @@ static inline bool is_tcf_tunnel_set(const struct tc_action *a)
|
||||
struct tcf_tunnel_key *t = to_tunnel_key(a);
|
||||
struct tcf_tunnel_key_params *params = rtnl_dereference(t->params);
|
||||
|
||||
if (a->ops && a->ops->type == TCA_ACT_TUNNEL_KEY)
|
||||
if (a->ops && a->ops->id == TCA_ID_TUNNEL_KEY)
|
||||
return params->tcft_action == TCA_TUNNEL_KEY_ACT_SET;
|
||||
#endif
|
||||
return false;
|
||||
@@ -46,7 +46,7 @@ static inline bool is_tcf_tunnel_release(const struct tc_action *a)
|
||||
struct tcf_tunnel_key *t = to_tunnel_key(a);
|
||||
struct tcf_tunnel_key_params *params = rtnl_dereference(t->params);
|
||||
|
||||
if (a->ops && a->ops->type == TCA_ACT_TUNNEL_KEY)
|
||||
if (a->ops && a->ops->id == TCA_ID_TUNNEL_KEY)
|
||||
return params->tcft_action == TCA_TUNNEL_KEY_ACT_RELEASE;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
@@ -30,7 +30,7 @@ struct tcf_vlan {
|
||||
static inline bool is_tcf_vlan(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_VLAN)
|
||||
if (a->ops && a->ops->id == TCA_ID_VLAN)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
@@ -199,15 +199,8 @@ enum {
|
||||
};
|
||||
|
||||
struct cipher_context {
|
||||
u16 prepend_size;
|
||||
u16 tag_size;
|
||||
u16 overhead_size;
|
||||
u16 iv_size;
|
||||
char *iv;
|
||||
u16 rec_seq_size;
|
||||
char *rec_seq;
|
||||
u16 aad_size;
|
||||
u16 tail_size;
|
||||
};
|
||||
|
||||
union tls_crypto_context {
|
||||
@@ -218,7 +211,21 @@ union tls_crypto_context {
|
||||
};
|
||||
};
|
||||
|
||||
struct tls_prot_info {
|
||||
u16 version;
|
||||
u16 cipher_type;
|
||||
u16 prepend_size;
|
||||
u16 tag_size;
|
||||
u16 overhead_size;
|
||||
u16 iv_size;
|
||||
u16 rec_seq_size;
|
||||
u16 aad_size;
|
||||
u16 tail_size;
|
||||
};
|
||||
|
||||
struct tls_context {
|
||||
struct tls_prot_info prot_info;
|
||||
|
||||
union tls_crypto_context crypto_send;
|
||||
union tls_crypto_context crypto_recv;
|
||||
|
||||
@@ -401,16 +408,26 @@ static inline bool tls_bigint_increment(unsigned char *seq, int len)
|
||||
return (i == -1);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static inline void tls_advance_record_sn(struct sock *sk,
|
||||
struct cipher_context *ctx,
|
||||
int version)
|
||||
{
|
||||
if (tls_bigint_increment(ctx->rec_seq, ctx->rec_seq_size))
|
||||
struct tls_context *tls_ctx = tls_get_ctx(sk);
|
||||
struct tls_prot_info *prot = &tls_ctx->prot_info;
|
||||
|
||||
if (tls_bigint_increment(ctx->rec_seq, prot->rec_seq_size))
|
||||
tls_err_abort(sk, EBADMSG);
|
||||
|
||||
if (version != TLS_1_3_VERSION) {
|
||||
tls_bigint_increment(ctx->iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE,
|
||||
ctx->iv_size);
|
||||
prot->iv_size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,9 +437,10 @@ static inline void tls_fill_prepend(struct tls_context *ctx,
|
||||
unsigned char record_type,
|
||||
int version)
|
||||
{
|
||||
size_t pkt_len, iv_size = ctx->tx.iv_size;
|
||||
struct tls_prot_info *prot = &ctx->prot_info;
|
||||
size_t pkt_len, iv_size = prot->iv_size;
|
||||
|
||||
pkt_len = plaintext_len + ctx->tx.tag_size;
|
||||
pkt_len = plaintext_len + prot->tag_size;
|
||||
if (version != TLS_1_3_VERSION) {
|
||||
pkt_len += iv_size;
|
||||
|
||||
@@ -475,12 +493,6 @@ static inline void xor_iv_with_seq(int version, char *iv, char *seq)
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static inline struct tls_sw_context_rx *tls_sw_ctx_rx(
|
||||
const struct tls_context *tls_ctx)
|
||||
|
||||
Reference in New Issue
Block a user