Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
This merge resolves conflicts with 75aec9df3a
("bridge: Remove
br_nf_push_frag_xmit_sk") as part of Eric Biederman's effort to improve
netns support in the network stack that reached upstream via David's
net-next tree.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Conflicts:
net/bridge/br_netfilter_hooks.c
This commit is contained in:
@@ -61,6 +61,16 @@
|
||||
#define UIP_PROTO_UDP 17 /* ipv6 next header value for UDP */
|
||||
#define UIP_FRAGH_LEN 8 /* ipv6 fragment header size */
|
||||
|
||||
#define EUI64_ADDR_LEN 8
|
||||
|
||||
#define LOWPAN_NHC_MAX_ID_LEN 1
|
||||
/* Max IPHC Header len without IPv6 hdr specific inline data.
|
||||
* Useful for getting the "extra" bytes we need at worst case compression.
|
||||
*
|
||||
* LOWPAN_IPHC + CID + LOWPAN_NHC_MAX_ID_LEN
|
||||
*/
|
||||
#define LOWPAN_IPHC_MAX_HEADER_LEN (2 + 1 + LOWPAN_NHC_MAX_ID_LEN)
|
||||
|
||||
/*
|
||||
* ipv6 address based on mac
|
||||
* second bit-flip (Universe/Local) is done according RFC2464
|
||||
|
@@ -122,11 +122,14 @@ struct bt_voice {
|
||||
__printf(1, 2)
|
||||
void bt_info(const char *fmt, ...);
|
||||
__printf(1, 2)
|
||||
void bt_warn(const char *fmt, ...);
|
||||
__printf(1, 2)
|
||||
void bt_err(const char *fmt, ...);
|
||||
__printf(1, 2)
|
||||
void bt_err_ratelimited(const char *fmt, ...);
|
||||
|
||||
#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
|
||||
#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
|
||||
#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
|
||||
#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
|
||||
|
||||
@@ -134,6 +137,8 @@ void bt_err_ratelimited(const char *fmt, ...);
|
||||
|
||||
#define bt_dev_info(hdev, fmt, ...) \
|
||||
BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
|
||||
#define bt_dev_warn(hdev, fmt, ...) \
|
||||
BT_WARN("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
|
||||
#define bt_dev_err(hdev, fmt, ...) \
|
||||
BT_ERR("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
|
||||
#define bt_dev_dbg(hdev, fmt, ...) \
|
||||
|
@@ -44,6 +44,8 @@
|
||||
#define HCI_DEV_DOWN 4
|
||||
#define HCI_DEV_SUSPEND 5
|
||||
#define HCI_DEV_RESUME 6
|
||||
#define HCI_DEV_OPEN 7
|
||||
#define HCI_DEV_CLOSE 8
|
||||
|
||||
/* HCI notify events */
|
||||
#define HCI_NOTIFY_CONN_ADD 1
|
||||
@@ -238,6 +240,7 @@ enum {
|
||||
HCI_LE_SCAN_INTERRUPTED,
|
||||
|
||||
HCI_DUT_MODE,
|
||||
HCI_VENDOR_DIAG,
|
||||
HCI_FORCE_BREDR_SMP,
|
||||
HCI_FORCE_STATIC_ADDR,
|
||||
|
||||
@@ -260,6 +263,7 @@ enum {
|
||||
#define HCI_ACLDATA_PKT 0x02
|
||||
#define HCI_SCODATA_PKT 0x03
|
||||
#define HCI_EVENT_PKT 0x04
|
||||
#define HCI_DIAG_PKT 0xf0
|
||||
#define HCI_VENDOR_PKT 0xff
|
||||
|
||||
/* HCI packet types */
|
||||
|
@@ -398,6 +398,7 @@ struct hci_dev {
|
||||
int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
void (*notify)(struct hci_dev *hdev, unsigned int evt);
|
||||
void (*hw_error)(struct hci_dev *hdev, u8 code);
|
||||
int (*set_diag)(struct hci_dev *hdev, bool enable);
|
||||
int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr);
|
||||
};
|
||||
|
||||
@@ -1066,6 +1067,7 @@ int hci_remove_adv_instance(struct hci_dev *hdev, u8 instance);
|
||||
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
|
||||
int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
int hci_recv_diag(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
|
||||
void hci_init_sysfs(struct hci_dev *hdev);
|
||||
void hci_conn_init_sysfs(struct hci_conn *conn);
|
||||
@@ -1349,6 +1351,9 @@ void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
|
||||
|
||||
void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
|
||||
|
||||
struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
|
||||
const void *param, u32 timeout);
|
||||
|
||||
/* ----- HCI Sockets ----- */
|
||||
void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
|
||||
void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
|
||||
|
@@ -39,6 +39,10 @@ struct hci_mon_hdr {
|
||||
#define HCI_MON_ACL_RX_PKT 5
|
||||
#define HCI_MON_SCO_TX_PKT 6
|
||||
#define HCI_MON_SCO_RX_PKT 7
|
||||
#define HCI_MON_OPEN_INDEX 8
|
||||
#define HCI_MON_CLOSE_INDEX 9
|
||||
#define HCI_MON_INDEX_INFO 10
|
||||
#define HCI_MON_VENDOR_DIAG 11
|
||||
|
||||
struct hci_mon_new_index {
|
||||
__u8 type;
|
||||
@@ -48,4 +52,10 @@ struct hci_mon_new_index {
|
||||
} __packed;
|
||||
#define HCI_MON_NEW_INDEX_SIZE 16
|
||||
|
||||
struct hci_mon_index_info {
|
||||
bdaddr_t bdaddr;
|
||||
__le16 manufacturer;
|
||||
} __packed;
|
||||
#define HCI_MON_INDEX_INFO_SIZE 8
|
||||
|
||||
#endif /* __HCI_MON_H */
|
||||
|
@@ -858,6 +858,8 @@ struct station_del_parameters {
|
||||
/**
|
||||
* enum cfg80211_station_type - the type of station being modified
|
||||
* @CFG80211_STA_AP_CLIENT: client of an AP interface
|
||||
* @CFG80211_STA_AP_CLIENT_UNASSOC: client of an AP interface that is still
|
||||
* unassociated (update properties for this type of client is permitted)
|
||||
* @CFG80211_STA_AP_MLME_CLIENT: client of an AP interface that has
|
||||
* the AP MLME in the device
|
||||
* @CFG80211_STA_AP_STA: AP station on managed interface
|
||||
@@ -873,6 +875,7 @@ struct station_del_parameters {
|
||||
*/
|
||||
enum cfg80211_station_type {
|
||||
CFG80211_STA_AP_CLIENT,
|
||||
CFG80211_STA_AP_CLIENT_UNASSOC,
|
||||
CFG80211_STA_AP_MLME_CLIENT,
|
||||
CFG80211_STA_AP_STA,
|
||||
CFG80211_STA_IBSS,
|
||||
@@ -2971,12 +2974,21 @@ enum wiphy_vendor_command_flags {
|
||||
* @doit: callback for the operation, note that wdev is %NULL if the
|
||||
* flags didn't ask for a wdev and non-%NULL otherwise; the data
|
||||
* pointer may be %NULL if userspace provided no data at all
|
||||
* @dumpit: dump callback, for transferring bigger/multiple items. The
|
||||
* @storage points to cb->args[5], ie. is preserved over the multiple
|
||||
* dumpit calls.
|
||||
* It's recommended to not have the same sub command with both @doit and
|
||||
* @dumpit, so that userspace can assume certain ones are get and others
|
||||
* are used with dump requests.
|
||||
*/
|
||||
struct wiphy_vendor_command {
|
||||
struct nl80211_vendor_cmd_info info;
|
||||
u32 flags;
|
||||
int (*doit)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const void *data, int data_len);
|
||||
int (*dumpit)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct sk_buff *skb, const void *data, int data_len,
|
||||
unsigned long *storage);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -27,6 +27,16 @@
|
||||
struct wpan_phy;
|
||||
struct wpan_phy_cca;
|
||||
|
||||
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
|
||||
struct ieee802154_llsec_device_key;
|
||||
struct ieee802154_llsec_seclevel;
|
||||
struct ieee802154_llsec_params;
|
||||
struct ieee802154_llsec_device;
|
||||
struct ieee802154_llsec_table;
|
||||
struct ieee802154_llsec_key_id;
|
||||
struct ieee802154_llsec_key;
|
||||
#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
|
||||
|
||||
struct cfg802154_ops {
|
||||
struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
|
||||
const char *name,
|
||||
@@ -65,6 +75,51 @@ struct cfg802154_ops {
|
||||
struct wpan_dev *wpan_dev, bool mode);
|
||||
int (*set_ackreq_default)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev, bool ackreq);
|
||||
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
|
||||
void (*get_llsec_table)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
struct ieee802154_llsec_table **table);
|
||||
void (*lock_llsec_table)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev);
|
||||
void (*unlock_llsec_table)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev);
|
||||
/* TODO remove locking/get table callbacks, this is part of the
|
||||
* nl802154 interface and should be accessible from ieee802154 layer.
|
||||
*/
|
||||
int (*get_llsec_params)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
struct ieee802154_llsec_params *params);
|
||||
int (*set_llsec_params)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_params *params,
|
||||
int changed);
|
||||
int (*add_llsec_key)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_key_id *id,
|
||||
const struct ieee802154_llsec_key *key);
|
||||
int (*del_llsec_key)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_key_id *id);
|
||||
int (*add_seclevel)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_seclevel *sl);
|
||||
int (*del_seclevel)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_seclevel *sl);
|
||||
int (*add_device)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
const struct ieee802154_llsec_device *dev);
|
||||
int (*del_device)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev, __le64 extended_addr);
|
||||
int (*add_devkey)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
__le64 extended_addr,
|
||||
const struct ieee802154_llsec_device_key *key);
|
||||
int (*del_devkey)(struct wpan_phy *wpan_phy,
|
||||
struct wpan_dev *wpan_dev,
|
||||
__le64 extended_addr,
|
||||
const struct ieee802154_llsec_device_key *key);
|
||||
#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
|
||||
};
|
||||
|
||||
static inline bool
|
||||
@@ -167,6 +222,102 @@ struct wpan_phy {
|
||||
char priv[0] __aligned(NETDEV_ALIGN);
|
||||
};
|
||||
|
||||
struct ieee802154_addr {
|
||||
u8 mode;
|
||||
__le16 pan_id;
|
||||
union {
|
||||
__le16 short_addr;
|
||||
__le64 extended_addr;
|
||||
};
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_key_id {
|
||||
u8 mode;
|
||||
u8 id;
|
||||
union {
|
||||
struct ieee802154_addr device_addr;
|
||||
__le32 short_source;
|
||||
__le64 extended_source;
|
||||
};
|
||||
};
|
||||
|
||||
#define IEEE802154_LLSEC_KEY_SIZE 16
|
||||
|
||||
struct ieee802154_llsec_key {
|
||||
u8 frame_types;
|
||||
u32 cmd_frame_ids;
|
||||
/* TODO replace with NL802154_KEY_SIZE */
|
||||
u8 key[IEEE802154_LLSEC_KEY_SIZE];
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_key_entry {
|
||||
struct list_head list;
|
||||
|
||||
struct ieee802154_llsec_key_id id;
|
||||
struct ieee802154_llsec_key *key;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_params {
|
||||
bool enabled;
|
||||
|
||||
__be32 frame_counter;
|
||||
u8 out_level;
|
||||
struct ieee802154_llsec_key_id out_key;
|
||||
|
||||
__le64 default_key_source;
|
||||
|
||||
__le16 pan_id;
|
||||
__le64 hwaddr;
|
||||
__le64 coord_hwaddr;
|
||||
__le16 coord_shortaddr;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_table {
|
||||
struct list_head keys;
|
||||
struct list_head devices;
|
||||
struct list_head security_levels;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_seclevel {
|
||||
struct list_head list;
|
||||
|
||||
u8 frame_type;
|
||||
u8 cmd_frame_id;
|
||||
bool device_override;
|
||||
u32 sec_levels;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_device {
|
||||
struct list_head list;
|
||||
|
||||
__le16 pan_id;
|
||||
__le16 short_addr;
|
||||
__le64 hwaddr;
|
||||
u32 frame_counter;
|
||||
bool seclevel_exempt;
|
||||
|
||||
u8 key_mode;
|
||||
struct list_head keys;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_device_key {
|
||||
struct list_head list;
|
||||
|
||||
struct ieee802154_llsec_key_id key_id;
|
||||
u32 frame_counter;
|
||||
};
|
||||
|
||||
struct wpan_dev_header_ops {
|
||||
/* TODO create callback currently assumes ieee802154_mac_cb inside
|
||||
* skb->cb. This should be changed to give these information as
|
||||
* parameter.
|
||||
*/
|
||||
int (*create)(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct ieee802154_addr *daddr,
|
||||
const struct ieee802154_addr *saddr,
|
||||
unsigned int len);
|
||||
};
|
||||
|
||||
struct wpan_dev {
|
||||
struct wpan_phy *wpan_phy;
|
||||
int iftype;
|
||||
@@ -175,6 +326,8 @@ struct wpan_dev {
|
||||
struct list_head list;
|
||||
struct net_device *netdev;
|
||||
|
||||
const struct wpan_dev_header_ops *header_ops;
|
||||
|
||||
/* lowpan interface, set when the wpan_dev belongs to one lowpan_dev */
|
||||
struct net_device *lowpan_dev;
|
||||
|
||||
@@ -205,6 +358,17 @@ struct wpan_dev {
|
||||
|
||||
#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
|
||||
|
||||
static inline int
|
||||
wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct ieee802154_addr *daddr,
|
||||
const struct ieee802154_addr *saddr,
|
||||
unsigned int len)
|
||||
{
|
||||
struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
|
||||
|
||||
return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len);
|
||||
}
|
||||
|
||||
struct wpan_phy *
|
||||
wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size);
|
||||
static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
|
||||
|
@@ -197,6 +197,9 @@ static inline u8 dsa_upstream_port(struct dsa_switch *ds)
|
||||
return ds->pd->rtable[dst->cpu_switch];
|
||||
}
|
||||
|
||||
struct switchdev_trans;
|
||||
struct switchdev_obj_port_fdb;
|
||||
|
||||
struct dsa_switch_driver {
|
||||
struct list_head list;
|
||||
|
||||
@@ -316,10 +319,14 @@ struct dsa_switch_driver {
|
||||
/*
|
||||
* Forwarding database
|
||||
*/
|
||||
int (*port_fdb_prepare)(struct dsa_switch *ds, int port,
|
||||
const struct switchdev_obj_port_fdb *fdb,
|
||||
struct switchdev_trans *trans);
|
||||
int (*port_fdb_add)(struct dsa_switch *ds, int port,
|
||||
const unsigned char *addr, u16 vid);
|
||||
const struct switchdev_obj_port_fdb *fdb,
|
||||
struct switchdev_trans *trans);
|
||||
int (*port_fdb_del)(struct dsa_switch *ds, int port,
|
||||
const unsigned char *addr, u16 vid);
|
||||
const struct switchdev_obj_port_fdb *fdb);
|
||||
int (*port_fdb_getnext)(struct dsa_switch *ds, int port,
|
||||
unsigned char *addr, u16 *vid,
|
||||
bool *is_static);
|
||||
|
@@ -45,7 +45,7 @@ struct dst_entry {
|
||||
void *__pad1;
|
||||
#endif
|
||||
int (*input)(struct sk_buff *);
|
||||
int (*output)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
unsigned short flags;
|
||||
#define DST_HOST 0x0001
|
||||
@@ -365,10 +365,10 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev,
|
||||
__skb_tunnel_rx(skb, dev, net);
|
||||
}
|
||||
|
||||
int dst_discard_sk(struct sock *sk, struct sk_buff *skb);
|
||||
int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
static inline int dst_discard(struct sk_buff *skb)
|
||||
{
|
||||
return dst_discard_sk(skb->sk, skb);
|
||||
return dst_discard_out(&init_net, skb->sk, skb);
|
||||
}
|
||||
void *dst_alloc(struct dst_ops *ops, struct net_device *dev, int initial_ref,
|
||||
int initial_obsolete, unsigned short flags);
|
||||
@@ -454,13 +454,9 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)
|
||||
}
|
||||
|
||||
/* Output packet to network from transport. */
|
||||
static inline int dst_output(struct sock *sk, struct sk_buff *skb)
|
||||
static inline int dst_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
return skb_dst(skb)->output(sk, skb);
|
||||
}
|
||||
static inline int dst_output_okfn(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
return dst_output(sk, skb);
|
||||
return skb_dst(skb)->output(net, sk, skb);
|
||||
}
|
||||
|
||||
/* Input packet from network to transport. */
|
||||
|
@@ -9,6 +9,7 @@ struct kmem_cachep;
|
||||
struct net_device;
|
||||
struct sk_buff;
|
||||
struct sock;
|
||||
struct net;
|
||||
|
||||
struct dst_ops {
|
||||
unsigned short family;
|
||||
@@ -28,7 +29,7 @@ struct dst_ops {
|
||||
struct sk_buff *skb, u32 mtu);
|
||||
void (*redirect)(struct dst_entry *dst, struct sock *sk,
|
||||
struct sk_buff *skb);
|
||||
int (*local_out)(struct sk_buff *skb);
|
||||
int (*local_out)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,
|
||||
struct sk_buff *skb,
|
||||
const void *daddr);
|
||||
|
@@ -34,7 +34,7 @@ struct flowi_common {
|
||||
__u8 flowic_flags;
|
||||
#define FLOWI_FLAG_ANYSRC 0x01
|
||||
#define FLOWI_FLAG_KNOWN_NH 0x02
|
||||
#define FLOWI_FLAG_VRFSRC 0x04
|
||||
#define FLOWI_FLAG_L3MDEV_SRC 0x04
|
||||
#define FLOWI_FLAG_SKIP_NH_OIF 0x08
|
||||
__u32 flowic_secid;
|
||||
struct flowi_tunnel flowic_tun_key;
|
||||
|
@@ -50,15 +50,6 @@ struct ieee802154_sechdr {
|
||||
};
|
||||
};
|
||||
|
||||
struct ieee802154_addr {
|
||||
u8 mode;
|
||||
__le16 pan_id;
|
||||
union {
|
||||
__le16 short_addr;
|
||||
__le64 extended_addr;
|
||||
};
|
||||
};
|
||||
|
||||
struct ieee802154_hdr_fc {
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
u16 type:3,
|
||||
@@ -99,7 +90,7 @@ struct ieee802154_hdr {
|
||||
* hdr->fc will be ignored. this includes the INTRA_PAN bit and the frame
|
||||
* version, if SECEN is set.
|
||||
*/
|
||||
int ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr);
|
||||
int ieee802154_hdr_push(struct sk_buff *skb, struct ieee802154_hdr *hdr);
|
||||
|
||||
/* pulls the entire 802.15.4 header off of the skb, including the security
|
||||
* header, and performs pan id decompression
|
||||
@@ -243,38 +234,6 @@ static inline struct ieee802154_mac_cb *mac_cb_init(struct sk_buff *skb)
|
||||
return mac_cb(skb);
|
||||
}
|
||||
|
||||
#define IEEE802154_LLSEC_KEY_SIZE 16
|
||||
|
||||
struct ieee802154_llsec_key_id {
|
||||
u8 mode;
|
||||
u8 id;
|
||||
union {
|
||||
struct ieee802154_addr device_addr;
|
||||
__le32 short_source;
|
||||
__le64 extended_source;
|
||||
};
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_key {
|
||||
u8 frame_types;
|
||||
u32 cmd_frame_ids;
|
||||
u8 key[IEEE802154_LLSEC_KEY_SIZE];
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_key_entry {
|
||||
struct list_head list;
|
||||
|
||||
struct ieee802154_llsec_key_id id;
|
||||
struct ieee802154_llsec_key *key;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_device_key {
|
||||
struct list_head list;
|
||||
|
||||
struct ieee802154_llsec_key_id key_id;
|
||||
u32 frame_counter;
|
||||
};
|
||||
|
||||
enum {
|
||||
IEEE802154_LLSEC_DEVKEY_IGNORE,
|
||||
IEEE802154_LLSEC_DEVKEY_RESTRICT,
|
||||
@@ -283,49 +242,6 @@ enum {
|
||||
__IEEE802154_LLSEC_DEVKEY_MAX,
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_device {
|
||||
struct list_head list;
|
||||
|
||||
__le16 pan_id;
|
||||
__le16 short_addr;
|
||||
__le64 hwaddr;
|
||||
u32 frame_counter;
|
||||
bool seclevel_exempt;
|
||||
|
||||
u8 key_mode;
|
||||
struct list_head keys;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_seclevel {
|
||||
struct list_head list;
|
||||
|
||||
u8 frame_type;
|
||||
u8 cmd_frame_id;
|
||||
bool device_override;
|
||||
u32 sec_levels;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_params {
|
||||
bool enabled;
|
||||
|
||||
__be32 frame_counter;
|
||||
u8 out_level;
|
||||
struct ieee802154_llsec_key_id out_key;
|
||||
|
||||
__le64 default_key_source;
|
||||
|
||||
__le16 pan_id;
|
||||
__le64 hwaddr;
|
||||
__le64 coord_hwaddr;
|
||||
__le16 coord_shortaddr;
|
||||
};
|
||||
|
||||
struct ieee802154_llsec_table {
|
||||
struct list_head keys;
|
||||
struct list_head devices;
|
||||
struct list_head security_levels;
|
||||
};
|
||||
|
||||
#define IEEE802154_MAC_SCAN_ED 0
|
||||
#define IEEE802154_MAC_SCAN_ACTIVE 1
|
||||
#define IEEE802154_MAC_SCAN_PASSIVE 2
|
||||
|
@@ -268,13 +268,8 @@ struct dst_entry *inet_csk_route_child_sock(const struct sock *sk,
|
||||
struct sock *newsk,
|
||||
const struct request_sock *req);
|
||||
|
||||
static inline void inet_csk_reqsk_queue_add(struct sock *sk,
|
||||
struct request_sock *req,
|
||||
struct sock *child)
|
||||
{
|
||||
reqsk_queue_add(&inet_csk(sk)->icsk_accept_queue, req, sk, child);
|
||||
}
|
||||
|
||||
void inet_csk_reqsk_queue_add(struct sock *sk, struct request_sock *req,
|
||||
struct sock *child);
|
||||
void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
|
||||
unsigned long timeout);
|
||||
|
||||
@@ -299,6 +294,7 @@ static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
|
||||
}
|
||||
|
||||
void inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req);
|
||||
void inet_csk_reqsk_queue_drop_and_put(struct sock *sk, struct request_sock *req);
|
||||
|
||||
void inet_csk_destroy_sock(struct sock *sk);
|
||||
void inet_csk_prepare_forced_close(struct sock *sk);
|
||||
@@ -312,7 +308,7 @@ static inline unsigned int inet_csk_listen_poll(const struct sock *sk)
|
||||
(POLLIN | POLLRDNORM) : 0;
|
||||
}
|
||||
|
||||
int inet_csk_listen_start(struct sock *sk, const int nr_table_entries);
|
||||
int inet_csk_listen_start(struct sock *sk, int backlog);
|
||||
void inet_csk_listen_stop(struct sock *sk);
|
||||
|
||||
void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
|
@@ -245,7 +245,8 @@ static inline unsigned int __inet_ehashfn(const __be32 laddr,
|
||||
}
|
||||
|
||||
struct request_sock *inet_reqsk_alloc(const struct request_sock_ops *ops,
|
||||
struct sock *sk_listener);
|
||||
struct sock *sk_listener,
|
||||
bool attach_listener);
|
||||
|
||||
static inline __u8 inet_sk_flowi_flags(const struct sock *sk)
|
||||
{
|
||||
|
@@ -70,6 +70,7 @@ struct inet_timewait_sock {
|
||||
#define tw_dport __tw_common.skc_dport
|
||||
#define tw_num __tw_common.skc_num
|
||||
#define tw_cookie __tw_common.skc_cookie
|
||||
#define tw_dr __tw_common.skc_tw_dr
|
||||
|
||||
int tw_timeout;
|
||||
volatile unsigned char tw_substate;
|
||||
@@ -88,7 +89,6 @@ struct inet_timewait_sock {
|
||||
kmemcheck_bitfield_end(flags);
|
||||
struct timer_list tw_timer;
|
||||
struct inet_bind_bucket *tw_tb;
|
||||
struct inet_timewait_death_row *tw_dr;
|
||||
};
|
||||
#define tw_tclass tw_tos
|
||||
|
||||
|
@@ -107,17 +107,13 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
|
||||
struct net_device *orig_dev);
|
||||
int ip_local_deliver(struct sk_buff *skb);
|
||||
int ip_mr_input(struct sk_buff *skb);
|
||||
int ip_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip_mc_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip_do_fragment(struct sock *sk, struct sk_buff *skb,
|
||||
int (*output)(struct sock *, struct sk_buff *));
|
||||
int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
|
||||
int (*output)(struct net *, struct sock *, struct sk_buff *));
|
||||
void ip_send_check(struct iphdr *ip);
|
||||
int __ip_local_out(struct sk_buff *skb);
|
||||
int ip_local_out_sk(struct sock *sk, struct sk_buff *skb);
|
||||
static inline int ip_local_out(struct sk_buff *skb)
|
||||
{
|
||||
return ip_local_out_sk(skb->sk, skb);
|
||||
}
|
||||
int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
|
||||
void ip_init(void);
|
||||
@@ -323,12 +319,15 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
|
||||
|
||||
static inline unsigned int ip_skb_dst_mtu(const struct sk_buff *skb)
|
||||
{
|
||||
if (!skb->sk || ip_sk_use_pmtu(skb->sk)) {
|
||||
struct sock *sk = skb->sk;
|
||||
|
||||
if (!sk || !sk_fullsock(sk) || ip_sk_use_pmtu(sk)) {
|
||||
bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
|
||||
|
||||
return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
|
||||
} else {
|
||||
return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
|
||||
}
|
||||
|
||||
return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
|
||||
}
|
||||
|
||||
u32 ip_idents_reserve(u32 hash, int segs);
|
||||
@@ -507,11 +506,11 @@ static inline bool ip_defrag_user_in_between(u32 user,
|
||||
return user >= lower_bond && user <= upper_bond;
|
||||
}
|
||||
|
||||
int ip_defrag(struct sk_buff *skb, u32 user);
|
||||
int ip_defrag(struct net *net, struct sk_buff *skb, u32 user);
|
||||
#ifdef CONFIG_INET
|
||||
struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user);
|
||||
struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user);
|
||||
#else
|
||||
static inline struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)
|
||||
static inline struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
|
||||
{
|
||||
return skb;
|
||||
}
|
||||
|
@@ -173,8 +173,8 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst,
|
||||
ipv6_addr_equal(&rt->rt6i_dst.addr, daddr));
|
||||
}
|
||||
|
||||
int ip6_fragment(struct sock *sk, struct sk_buff *skb,
|
||||
int (*output)(struct sock *, struct sk_buff *));
|
||||
int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
|
||||
int (*output)(struct net *, struct sock *, struct sk_buff *));
|
||||
|
||||
static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
|
||||
{
|
||||
|
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
|
||||
int pkt_len, err;
|
||||
|
||||
pkt_len = skb->len - skb_inner_network_offset(skb);
|
||||
err = ip6_local_out_sk(sk, skb);
|
||||
err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
|
||||
|
||||
if (net_xmit_eval(err) == 0) {
|
||||
struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
|
||||
|
@@ -79,7 +79,7 @@ struct fib_nh {
|
||||
unsigned char nh_scope;
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
||||
int nh_weight;
|
||||
int nh_power;
|
||||
atomic_t nh_upper_bound;
|
||||
#endif
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
__u32 nh_tclassid;
|
||||
@@ -118,7 +118,7 @@ struct fib_info {
|
||||
#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
|
||||
int fib_nhs;
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
||||
int fib_power;
|
||||
int fib_weight;
|
||||
#endif
|
||||
struct rcu_head rcu;
|
||||
struct fib_nh fib_nh[0];
|
||||
@@ -320,7 +320,17 @@ int ip_fib_check_default(__be32 gw, struct net_device *dev);
|
||||
int fib_sync_down_dev(struct net_device *dev, unsigned long event);
|
||||
int fib_sync_down_addr(struct net *net, __be32 local);
|
||||
int fib_sync_up(struct net_device *dev, unsigned int nh_flags);
|
||||
void fib_select_multipath(struct fib_result *res);
|
||||
|
||||
extern u32 fib_multipath_secret __read_mostly;
|
||||
|
||||
static inline int fib_multipath_hash(__be32 saddr, __be32 daddr)
|
||||
{
|
||||
return jhash_2words(saddr, daddr, fib_multipath_secret) >> 1;
|
||||
}
|
||||
|
||||
void fib_select_multipath(struct fib_result *res, int hash);
|
||||
void fib_select_path(struct net *net, struct fib_result *res,
|
||||
struct flowi4 *fl4, int mp_hash);
|
||||
|
||||
/* Exported by fib_trie.c */
|
||||
void fib_trie_init(void);
|
||||
|
@@ -860,14 +860,13 @@ struct dst_entry *ip6_blackhole_route(struct net *net,
|
||||
* skb processing functions
|
||||
*/
|
||||
|
||||
int ip6_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int ip6_forward(struct sk_buff *skb);
|
||||
int ip6_input(struct sk_buff *skb);
|
||||
int ip6_mc_input(struct sk_buff *skb);
|
||||
|
||||
int __ip6_local_out(struct sk_buff *skb);
|
||||
int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb);
|
||||
int ip6_local_out(struct sk_buff *skb);
|
||||
int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
/*
|
||||
* Extension header (options) processing
|
||||
|
@@ -17,12 +17,24 @@
|
||||
* @l3mdev_fib_table: Get FIB table id to use for lookups
|
||||
*
|
||||
* @l3mdev_get_rtable: Get cached IPv4 rtable (dst_entry) for device
|
||||
*
|
||||
* @l3mdev_get_saddr: Get source address for a flow
|
||||
*
|
||||
* @l3mdev_get_rt6_dst: Get cached IPv6 rt6_info (dst_entry) for device
|
||||
*/
|
||||
|
||||
struct l3mdev_ops {
|
||||
u32 (*l3mdev_fib_table)(const struct net_device *dev);
|
||||
|
||||
/* IPv4 ops */
|
||||
struct rtable * (*l3mdev_get_rtable)(const struct net_device *dev,
|
||||
const struct flowi4 *fl4);
|
||||
void (*l3mdev_get_saddr)(struct net_device *dev,
|
||||
struct flowi4 *fl4);
|
||||
|
||||
/* IPv6 ops */
|
||||
struct dst_entry * (*l3mdev_get_rt6_dst)(const struct net_device *dev,
|
||||
const struct flowi6 *fl6);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NET_L3_MASTER_DEV
|
||||
@@ -100,6 +112,50 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline void l3mdev_get_saddr(struct net *net, int ifindex,
|
||||
struct flowi4 *fl4)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
if (ifindex) {
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
dev = dev_get_by_index_rcu(net, ifindex);
|
||||
if (dev && netif_is_l3_master(dev) &&
|
||||
dev->l3mdev_ops->l3mdev_get_saddr) {
|
||||
dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
|
||||
const struct flowi6 *fl6)
|
||||
{
|
||||
if (netif_is_l3_master(dev) && dev->l3mdev_ops->l3mdev_get_rt6_dst)
|
||||
return dev->l3mdev_ops->l3mdev_get_rt6_dst(dev, fl6);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline
|
||||
struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net,
|
||||
const struct flowi6 *fl6)
|
||||
{
|
||||
struct dst_entry *dst = NULL;
|
||||
struct net_device *dev;
|
||||
|
||||
dev = dev_get_by_index(net, fl6->flowi6_oif);
|
||||
if (dev) {
|
||||
dst = l3mdev_get_rt6_dst(dev, fl6);
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int l3mdev_master_ifindex_rcu(struct net_device *dev)
|
||||
@@ -144,6 +200,23 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void l3mdev_get_saddr(struct net *net, int ifindex,
|
||||
struct flowi4 *fl4)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
|
||||
const struct flowi6 *fl6)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline
|
||||
struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net,
|
||||
const struct flowi6 *fl6)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NET_L3MDEV_H_ */
|
||||
|
@@ -18,7 +18,7 @@ struct lwtunnel_state {
|
||||
__u16 type;
|
||||
__u16 flags;
|
||||
atomic_t refcnt;
|
||||
int (*orig_output)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*orig_output)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int (*orig_input)(struct sk_buff *);
|
||||
int len;
|
||||
__u8 data[0];
|
||||
@@ -28,7 +28,7 @@ struct lwtunnel_encap_ops {
|
||||
int (*build_state)(struct net_device *dev, struct nlattr *encap,
|
||||
unsigned int family, const void *cfg,
|
||||
struct lwtunnel_state **ts);
|
||||
int (*output)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int (*input)(struct sk_buff *skb);
|
||||
int (*fill_encap)(struct sk_buff *skb,
|
||||
struct lwtunnel_state *lwtstate);
|
||||
@@ -88,7 +88,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb,
|
||||
int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
|
||||
struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len);
|
||||
int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
|
||||
int lwtunnel_output(struct sock *sk, struct sk_buff *skb);
|
||||
int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int lwtunnel_input(struct sk_buff *skb);
|
||||
|
||||
#else
|
||||
@@ -160,7 +160,7 @@ static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int lwtunnel_output(struct sock *sk, struct sk_buff *skb)
|
||||
static inline int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@
|
||||
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
||||
* Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015 Intel Deutschland GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -1360,6 +1361,8 @@ enum ieee80211_vif_flags {
|
||||
* @debugfs_dir: debugfs dentry, can be used by drivers to create own per
|
||||
* interface debug files. Note that it will be NULL for the virtual
|
||||
* monitor interface (if that is requested.)
|
||||
* @probe_req_reg: probe requests should be reported to mac80211 for this
|
||||
* interface.
|
||||
* @drv_priv: data area for driver use, will always be aligned to
|
||||
* sizeof(void *).
|
||||
* @txq: the multicast data TX queue (if driver uses the TXQ abstraction)
|
||||
@@ -1384,6 +1387,8 @@ struct ieee80211_vif {
|
||||
struct dentry *debugfs_dir;
|
||||
#endif
|
||||
|
||||
unsigned int probe_req_reg;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __aligned(sizeof(void *));
|
||||
};
|
||||
@@ -1494,10 +1499,8 @@ enum ieee80211_key_flags {
|
||||
* - Temporal Authenticator Rx MIC Key (64 bits)
|
||||
* @icv_len: The ICV length for this key type
|
||||
* @iv_len: The IV length for this key type
|
||||
* @drv_priv: pointer for driver use
|
||||
*/
|
||||
struct ieee80211_key_conf {
|
||||
void *drv_priv;
|
||||
atomic64_t tx_pn;
|
||||
u32 cipher;
|
||||
u8 icv_len;
|
||||
@@ -1894,6 +1897,12 @@ struct ieee80211_txq {
|
||||
* @IEEE80211_HW_TDLS_WIDER_BW: The device/driver supports wider bandwidth
|
||||
* than then BSS bandwidth for a TDLS link on the base channel.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU: The driver supports receiving A-MSDUs
|
||||
* within A-MPDU.
|
||||
*
|
||||
* @IEEE80211_HW_BEACON_TX_STATUS: The device/driver provides TX status
|
||||
* for sent beacons.
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
@@ -1927,6 +1936,8 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_SUPPORTS_CLONED_SKBS,
|
||||
IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS,
|
||||
IEEE80211_HW_TDLS_WIDER_BW,
|
||||
IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU,
|
||||
IEEE80211_HW_BEACON_TX_STATUS,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
@@ -2827,6 +2838,13 @@ enum ieee80211_reconfig_type {
|
||||
* See the section "Frame filtering" for more information.
|
||||
* This callback must be implemented and can sleep.
|
||||
*
|
||||
* @config_iface_filter: Configure the interface's RX filter.
|
||||
* This callback is optional and is used to configure which frames
|
||||
* should be passed to mac80211. The filter_flags is the combination
|
||||
* of FIF_* flags. The changed_flags is a bit mask that indicates
|
||||
* which flags are changed.
|
||||
* This callback can sleep.
|
||||
*
|
||||
* @set_tim: Set TIM bit. mac80211 calls this function when a TIM bit
|
||||
* must be set or cleared for a given STA. Must be atomic.
|
||||
*
|
||||
@@ -3016,6 +3034,9 @@ enum ieee80211_reconfig_type {
|
||||
* buffer size of 8. Correct ways to retransmit #1 would be:
|
||||
* - TX: 1 or 18 or 81
|
||||
* Even "189" would be wrong since 1 could be lost again.
|
||||
* The @amsdu parameter is valid when the action is set to
|
||||
* %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's ability
|
||||
* to receive A-MSDU within A-MPDU.
|
||||
*
|
||||
* Returns a negative error code on failure.
|
||||
* The callback can sleep.
|
||||
@@ -3266,6 +3287,10 @@ struct ieee80211_ops {
|
||||
unsigned int changed_flags,
|
||||
unsigned int *total_flags,
|
||||
u64 multicast);
|
||||
void (*config_iface_filter)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int filter_flags,
|
||||
unsigned int changed_flags);
|
||||
int (*set_tim)(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
||||
bool set);
|
||||
int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
@@ -3349,7 +3374,7 @@ struct ieee80211_ops {
|
||||
struct ieee80211_vif *vif,
|
||||
enum ieee80211_ampdu_mlme_action action,
|
||||
struct ieee80211_sta *sta, u16 tid, u16 *ssn,
|
||||
u8 buf_size);
|
||||
u8 buf_size, bool amsdu);
|
||||
int (*get_survey)(struct ieee80211_hw *hw, int idx,
|
||||
struct survey_info *survey);
|
||||
void (*rfkill_poll)(struct ieee80211_hw *hw);
|
||||
|
@@ -23,14 +23,6 @@
|
||||
|
||||
#include <net/cfg802154.h>
|
||||
|
||||
/* General MAC frame format:
|
||||
* 2 bytes: Frame Control
|
||||
* 1 byte: Sequence Number
|
||||
* 20 bytes: Addressing fields
|
||||
* 14 bytes: Auxiliary Security Header
|
||||
*/
|
||||
#define MAC802154_FRAME_HARD_HEADER_LEN (2 + 1 + 20 + 14)
|
||||
|
||||
/**
|
||||
* enum ieee802154_hw_addr_filt_flags - hardware address filtering flags
|
||||
*
|
||||
@@ -256,7 +248,7 @@ struct ieee802154_ops {
|
||||
static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb)
|
||||
{
|
||||
/* return some invalid fc on failure */
|
||||
if (unlikely(skb->mac_len < 2)) {
|
||||
if (unlikely(skb->len < 2)) {
|
||||
WARN_ON(1);
|
||||
return cpu_to_le16(0);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ void nf_defrag_ipv6_enable(void);
|
||||
|
||||
int nf_ct_frag6_init(void);
|
||||
void nf_ct_frag6_cleanup(void);
|
||||
struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
|
||||
struct sk_buff *nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user);
|
||||
void nf_ct_frag6_consume_orig(struct sk_buff *skb);
|
||||
|
||||
struct inet_frags_ctl;
|
||||
|
@@ -1003,6 +1003,15 @@ static inline __be32 nla_get_be32(const struct nlattr *nla)
|
||||
return *(__be32 *) nla_data(nla);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_le32 - return payload of __le32 attribute
|
||||
* @nla: __le32 netlink attribute
|
||||
*/
|
||||
static inline __le32 nla_get_le32(const struct nlattr *nla)
|
||||
{
|
||||
return *(__le32 *) nla_data(nla);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_u16 - return payload of u16 attribute
|
||||
* @nla: u16 netlink attribute
|
||||
@@ -1065,6 +1074,15 @@ static inline __be64 nla_get_be64(const struct nlattr *nla)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_le64 - return payload of __le64 attribute
|
||||
* @nla: __le64 netlink attribute
|
||||
*/
|
||||
static inline __le64 nla_get_le64(const struct nlattr *nla)
|
||||
{
|
||||
return *(__le64 *) nla_data(nla);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_s32 - return payload of s32 attribute
|
||||
* @nla: s32 netlink attribute
|
||||
|
@@ -56,6 +56,22 @@ enum nl802154_commands {
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
|
||||
NL802154_CMD_SET_SEC_PARAMS,
|
||||
NL802154_CMD_GET_SEC_KEY, /* can dump */
|
||||
NL802154_CMD_NEW_SEC_KEY,
|
||||
NL802154_CMD_DEL_SEC_KEY,
|
||||
NL802154_CMD_GET_SEC_DEV, /* can dump */
|
||||
NL802154_CMD_NEW_SEC_DEV,
|
||||
NL802154_CMD_DEL_SEC_DEV,
|
||||
NL802154_CMD_GET_SEC_DEVKEY, /* can dump */
|
||||
NL802154_CMD_NEW_SEC_DEVKEY,
|
||||
NL802154_CMD_DEL_SEC_DEVKEY,
|
||||
NL802154_CMD_GET_SEC_LEVEL, /* can dump */
|
||||
NL802154_CMD_NEW_SEC_LEVEL,
|
||||
NL802154_CMD_DEL_SEC_LEVEL,
|
||||
#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
|
||||
|
||||
/* used to define NL802154_CMD_MAX below */
|
||||
__NL802154_CMD_AFTER_LAST,
|
||||
NL802154_CMD_MAX = __NL802154_CMD_AFTER_LAST - 1
|
||||
@@ -110,6 +126,18 @@ enum nl802154_attrs {
|
||||
|
||||
/* add attributes here, update the policy in nl802154.c */
|
||||
|
||||
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
|
||||
NL802154_ATTR_SEC_ENABLED,
|
||||
NL802154_ATTR_SEC_OUT_LEVEL,
|
||||
NL802154_ATTR_SEC_OUT_KEY_ID,
|
||||
NL802154_ATTR_SEC_FRAME_COUNTER,
|
||||
|
||||
NL802154_ATTR_SEC_LEVEL,
|
||||
NL802154_ATTR_SEC_DEVICE,
|
||||
NL802154_ATTR_SEC_DEVKEY,
|
||||
NL802154_ATTR_SEC_KEY,
|
||||
#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
|
||||
|
||||
__NL802154_ATTR_AFTER_LAST,
|
||||
NL802154_ATTR_MAX = __NL802154_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
@@ -247,4 +275,167 @@ enum nl802154_supported_bool_states {
|
||||
NL802154_SUPPORTED_BOOL_MAX = __NL802154_SUPPORTED_BOOL_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
|
||||
|
||||
enum nl802154_dev_addr_modes {
|
||||
NL802154_DEV_ADDR_NONE,
|
||||
__NL802154_DEV_ADDR_INVALID,
|
||||
NL802154_DEV_ADDR_SHORT,
|
||||
NL802154_DEV_ADDR_EXTENDED,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_DEV_ADDR_AFTER_LAST,
|
||||
NL802154_DEV_ADDR_MAX = __NL802154_DEV_ADDR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_dev_addr_attrs {
|
||||
NL802154_DEV_ADDR_ATTR_UNSPEC,
|
||||
|
||||
NL802154_DEV_ADDR_ATTR_PAN_ID,
|
||||
NL802154_DEV_ADDR_ATTR_MODE,
|
||||
NL802154_DEV_ADDR_ATTR_SHORT,
|
||||
NL802154_DEV_ADDR_ATTR_EXTENDED,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_DEV_ADDR_ATTR_AFTER_LAST,
|
||||
NL802154_DEV_ADDR_ATTR_MAX = __NL802154_DEV_ADDR_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_key_id_modes {
|
||||
NL802154_KEY_ID_MODE_IMPLICIT,
|
||||
NL802154_KEY_ID_MODE_INDEX,
|
||||
NL802154_KEY_ID_MODE_INDEX_SHORT,
|
||||
NL802154_KEY_ID_MODE_INDEX_EXTENDED,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_KEY_ID_MODE_AFTER_LAST,
|
||||
NL802154_KEY_ID_MODE_MAX = __NL802154_KEY_ID_MODE_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_key_id_attrs {
|
||||
NL802154_KEY_ID_ATTR_UNSPEC,
|
||||
|
||||
NL802154_KEY_ID_ATTR_MODE,
|
||||
NL802154_KEY_ID_ATTR_INDEX,
|
||||
NL802154_KEY_ID_ATTR_IMPLICIT,
|
||||
NL802154_KEY_ID_ATTR_SOURCE_SHORT,
|
||||
NL802154_KEY_ID_ATTR_SOURCE_EXTENDED,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_KEY_ID_ATTR_AFTER_LAST,
|
||||
NL802154_KEY_ID_ATTR_MAX = __NL802154_KEY_ID_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_seclevels {
|
||||
NL802154_SECLEVEL_NONE,
|
||||
NL802154_SECLEVEL_MIC32,
|
||||
NL802154_SECLEVEL_MIC64,
|
||||
NL802154_SECLEVEL_MIC128,
|
||||
NL802154_SECLEVEL_ENC,
|
||||
NL802154_SECLEVEL_ENC_MIC32,
|
||||
NL802154_SECLEVEL_ENC_MIC64,
|
||||
NL802154_SECLEVEL_ENC_MIC128,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_SECLEVEL_AFTER_LAST,
|
||||
NL802154_SECLEVEL_MAX = __NL802154_SECLEVEL_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_frames {
|
||||
NL802154_FRAME_BEACON,
|
||||
NL802154_FRAME_DATA,
|
||||
NL802154_FRAME_ACK,
|
||||
NL802154_FRAME_CMD,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_FRAME_AFTER_LAST,
|
||||
NL802154_FRAME_MAX = __NL802154_FRAME_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_cmd_frames {
|
||||
__NL802154_CMD_FRAME_INVALID,
|
||||
NL802154_CMD_FRAME_ASSOC_REQUEST,
|
||||
NL802154_CMD_FRAME_ASSOC_RESPONSE,
|
||||
NL802154_CMD_FRAME_DISASSOC_NOTIFY,
|
||||
NL802154_CMD_FRAME_DATA_REQUEST,
|
||||
NL802154_CMD_FRAME_PAN_ID_CONFLICT_NOTIFY,
|
||||
NL802154_CMD_FRAME_ORPHAN_NOTIFY,
|
||||
NL802154_CMD_FRAME_BEACON_REQUEST,
|
||||
NL802154_CMD_FRAME_COORD_REALIGNMENT,
|
||||
NL802154_CMD_FRAME_GTS_REQUEST,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_CMD_FRAME_AFTER_LAST,
|
||||
NL802154_CMD_FRAME_MAX = __NL802154_CMD_FRAME_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_seclevel_attrs {
|
||||
NL802154_SECLEVEL_ATTR_UNSPEC,
|
||||
|
||||
NL802154_SECLEVEL_ATTR_LEVELS,
|
||||
NL802154_SECLEVEL_ATTR_FRAME,
|
||||
NL802154_SECLEVEL_ATTR_CMD_FRAME,
|
||||
NL802154_SECLEVEL_ATTR_DEV_OVERRIDE,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_SECLEVEL_ATTR_AFTER_LAST,
|
||||
NL802154_SECLEVEL_ATTR_MAX = __NL802154_SECLEVEL_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/* TODO what is this? couldn't find in mib */
|
||||
enum {
|
||||
NL802154_DEVKEY_IGNORE,
|
||||
NL802154_DEVKEY_RESTRICT,
|
||||
NL802154_DEVKEY_RECORD,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_DEVKEY_AFTER_LAST,
|
||||
NL802154_DEVKEY_MAX = __NL802154_DEVKEY_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_dev {
|
||||
NL802154_DEV_ATTR_UNSPEC,
|
||||
|
||||
NL802154_DEV_ATTR_FRAME_COUNTER,
|
||||
NL802154_DEV_ATTR_PAN_ID,
|
||||
NL802154_DEV_ATTR_SHORT_ADDR,
|
||||
NL802154_DEV_ATTR_EXTENDED_ADDR,
|
||||
NL802154_DEV_ATTR_SECLEVEL_EXEMPT,
|
||||
NL802154_DEV_ATTR_KEY_MODE,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_DEV_ATTR_AFTER_LAST,
|
||||
NL802154_DEV_ATTR_MAX = __NL802154_DEV_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_devkey {
|
||||
NL802154_DEVKEY_ATTR_UNSPEC,
|
||||
|
||||
NL802154_DEVKEY_ATTR_FRAME_COUNTER,
|
||||
NL802154_DEVKEY_ATTR_EXTENDED_ADDR,
|
||||
NL802154_DEVKEY_ATTR_ID,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_DEVKEY_ATTR_AFTER_LAST,
|
||||
NL802154_DEVKEY_ATTR_MAX = __NL802154_DEVKEY_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum nl802154_key {
|
||||
NL802154_KEY_ATTR_UNSPEC,
|
||||
|
||||
NL802154_KEY_ATTR_ID,
|
||||
NL802154_KEY_ATTR_USAGE_FRAMES,
|
||||
NL802154_KEY_ATTR_USAGE_CMDS,
|
||||
NL802154_KEY_ATTR_BYTES,
|
||||
|
||||
/* keep last */
|
||||
__NL802154_KEY_ATTR_AFTER_LAST,
|
||||
NL802154_KEY_ATTR_MAX = __NL802154_KEY_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#define NL802154_KEY_SIZE 16
|
||||
#define NL802154_CMD_FRAME_NR_IDS 256
|
||||
|
||||
#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
|
||||
|
||||
#endif /* __NL802154_H */
|
||||
|
@@ -50,16 +50,15 @@ struct request_sock {
|
||||
struct sock_common __req_common;
|
||||
#define rsk_refcnt __req_common.skc_refcnt
|
||||
#define rsk_hash __req_common.skc_hash
|
||||
#define rsk_listener __req_common.skc_listener
|
||||
#define rsk_window_clamp __req_common.skc_window_clamp
|
||||
#define rsk_rcv_wnd __req_common.skc_rcv_wnd
|
||||
|
||||
struct request_sock *dl_next;
|
||||
struct sock *rsk_listener;
|
||||
u16 mss;
|
||||
u8 num_retrans; /* number of retransmits */
|
||||
u8 cookie_ts:1; /* syncookie: encode tcpopts in timestamp */
|
||||
u8 num_timeout:7; /* number of timeouts */
|
||||
/* The following two fields can be easily recomputed I think -AK */
|
||||
u32 window_clamp; /* window clamp at creation time */
|
||||
u32 rcv_wnd; /* rcv_wnd offered first time */
|
||||
u32 ts_recent;
|
||||
struct timer_list rsk_timer;
|
||||
const struct request_sock_ops *rsk_ops;
|
||||
@@ -80,7 +79,8 @@ static inline struct sock *req_to_sk(struct request_sock *req)
|
||||
}
|
||||
|
||||
static inline struct request_sock *
|
||||
reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener)
|
||||
reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener,
|
||||
bool attach_listener)
|
||||
{
|
||||
struct request_sock *req;
|
||||
|
||||
@@ -88,10 +88,15 @@ reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener)
|
||||
|
||||
if (req) {
|
||||
req->rsk_ops = ops;
|
||||
sock_hold(sk_listener);
|
||||
req->rsk_listener = sk_listener;
|
||||
if (attach_listener) {
|
||||
sock_hold(sk_listener);
|
||||
req->rsk_listener = sk_listener;
|
||||
} else {
|
||||
req->rsk_listener = NULL;
|
||||
}
|
||||
req_to_sk(req)->sk_prot = sk_listener->sk_prot;
|
||||
sk_node_init(&req_to_sk(req)->sk_node);
|
||||
sk_tx_queue_clear(req_to_sk(req));
|
||||
req->saved_syn = NULL;
|
||||
/* Following is temporary. It is coupled with debugging
|
||||
* helpers in reqsk_put() & reqsk_free()
|
||||
@@ -181,25 +186,6 @@ static inline bool reqsk_queue_empty(const struct request_sock_queue *queue)
|
||||
return queue->rskq_accept_head == NULL;
|
||||
}
|
||||
|
||||
static inline void reqsk_queue_add(struct request_sock_queue *queue,
|
||||
struct request_sock *req,
|
||||
struct sock *parent,
|
||||
struct sock *child)
|
||||
{
|
||||
spin_lock(&queue->rskq_lock);
|
||||
req->sk = child;
|
||||
sk_acceptq_added(parent);
|
||||
|
||||
if (queue->rskq_accept_head == NULL)
|
||||
queue->rskq_accept_head = req;
|
||||
else
|
||||
queue->rskq_accept_tail->dl_next = req;
|
||||
|
||||
queue->rskq_accept_tail = req;
|
||||
req->dl_next = NULL;
|
||||
spin_unlock(&queue->rskq_lock);
|
||||
}
|
||||
|
||||
static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue,
|
||||
struct sock *parent)
|
||||
{
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#include <net/inetpeer.h>
|
||||
#include <net/flow.h>
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/ip_fib.h>
|
||||
#include <net/l3mdev.h>
|
||||
#include <linux/in_route.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
@@ -113,7 +114,15 @@ struct in_device;
|
||||
int ip_rt_init(void);
|
||||
void rt_cache_flush(struct net *net);
|
||||
void rt_flush_dev(struct net_device *dev);
|
||||
struct rtable *__ip_route_output_key(struct net *, struct flowi4 *flp);
|
||||
struct rtable *__ip_route_output_key_hash(struct net *, struct flowi4 *flp,
|
||||
int mp_hash);
|
||||
|
||||
static inline struct rtable *__ip_route_output_key(struct net *net,
|
||||
struct flowi4 *flp)
|
||||
{
|
||||
return __ip_route_output_key_hash(net, flp, -1);
|
||||
}
|
||||
|
||||
struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp,
|
||||
const struct sock *sk);
|
||||
struct dst_entry *ipv4_blackhole_route(struct net *net,
|
||||
@@ -257,9 +266,6 @@ static inline void ip_route_connect_init(struct flowi4 *fl4, __be32 dst, __be32
|
||||
if (inet_sk(sk)->transparent)
|
||||
flow_flags |= FLOWI_FLAG_ANYSRC;
|
||||
|
||||
if (netif_index_is_l3_master(sock_net(sk), oif))
|
||||
flow_flags |= FLOWI_FLAG_VRFSRC | FLOWI_FLAG_SKIP_NH_OIF;
|
||||
|
||||
flowi4_init_output(fl4, oif, sk->sk_mark, tos, RT_SCOPE_UNIVERSE,
|
||||
protocol, flow_flags, dst, src, dport, sport);
|
||||
}
|
||||
@@ -276,6 +282,10 @@ static inline struct rtable *ip_route_connect(struct flowi4 *fl4,
|
||||
ip_route_connect_init(fl4, dst, src, tos, oif, protocol,
|
||||
sport, dport, sk);
|
||||
|
||||
if (!src && oif) {
|
||||
l3mdev_get_saddr(net, oif, fl4);
|
||||
src = fl4->saddr;
|
||||
}
|
||||
if (!dst || !src) {
|
||||
rt = __ip_route_output_key(net, fl4);
|
||||
if (IS_ERR(rt))
|
||||
|
@@ -150,6 +150,10 @@ typedef __u64 __bitwise __addrpair;
|
||||
* @skc_node: main hash linkage for various protocol lookup tables
|
||||
* @skc_nulls_node: main hash linkage for TCP/UDP/UDP-Lite protocol
|
||||
* @skc_tx_queue_mapping: tx queue number for this connection
|
||||
* @skc_flags: place holder for sk_flags
|
||||
* %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
|
||||
* %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
|
||||
* @skc_incoming_cpu: record/match cpu processing incoming packets
|
||||
* @skc_refcnt: reference count
|
||||
*
|
||||
* This is the minimal network layer representation of sockets, the header
|
||||
@@ -200,6 +204,16 @@ struct sock_common {
|
||||
|
||||
atomic64_t skc_cookie;
|
||||
|
||||
/* following fields are padding to force
|
||||
* offset(struct sock, sk_refcnt) == 128 on 64bit arches
|
||||
* assuming IPV6 is enabled. We use this padding differently
|
||||
* for different kind of 'sockets'
|
||||
*/
|
||||
union {
|
||||
unsigned long skc_flags;
|
||||
struct sock *skc_listener; /* request_sock */
|
||||
struct inet_timewait_death_row *skc_tw_dr; /* inet_timewait_sock */
|
||||
};
|
||||
/*
|
||||
* fields between dontcopy_begin/dontcopy_end
|
||||
* are not copied in sock_copy()
|
||||
@@ -212,9 +226,20 @@ struct sock_common {
|
||||
struct hlist_nulls_node skc_nulls_node;
|
||||
};
|
||||
int skc_tx_queue_mapping;
|
||||
union {
|
||||
int skc_incoming_cpu;
|
||||
u32 skc_rcv_wnd;
|
||||
u32 skc_tw_rcv_nxt; /* struct tcp_timewait_sock */
|
||||
};
|
||||
|
||||
atomic_t skc_refcnt;
|
||||
/* private: */
|
||||
int skc_dontcopy_end[0];
|
||||
union {
|
||||
u32 skc_rxhash;
|
||||
u32 skc_window_clamp;
|
||||
u32 skc_tw_snd_nxt; /* struct tcp_timewait_sock */
|
||||
};
|
||||
/* public: */
|
||||
};
|
||||
|
||||
@@ -243,8 +268,6 @@ struct cg_proto;
|
||||
* @sk_pacing_rate: Pacing rate (if supported by transport/packet scheduler)
|
||||
* @sk_max_pacing_rate: Maximum pacing rate (%SO_MAX_PACING_RATE)
|
||||
* @sk_sndbuf: size of send buffer in bytes
|
||||
* @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
|
||||
* %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
|
||||
* @sk_no_check_tx: %SO_NO_CHECK setting, set checksum in TX packets
|
||||
* @sk_no_check_rx: allow zero checksum in RX packets
|
||||
* @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
|
||||
@@ -273,8 +296,6 @@ struct cg_proto;
|
||||
* @sk_rcvlowat: %SO_RCVLOWAT setting
|
||||
* @sk_rcvtimeo: %SO_RCVTIMEO setting
|
||||
* @sk_sndtimeo: %SO_SNDTIMEO setting
|
||||
* @sk_rxhash: flow hash received from netif layer
|
||||
* @sk_incoming_cpu: record cpu processing incoming packets
|
||||
* @sk_txhash: computed flow hash for use on transmit
|
||||
* @sk_filter: socket filtering instructions
|
||||
* @sk_timer: sock cleanup timer
|
||||
@@ -331,6 +352,9 @@ struct sock {
|
||||
#define sk_v6_daddr __sk_common.skc_v6_daddr
|
||||
#define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
|
||||
#define sk_cookie __sk_common.skc_cookie
|
||||
#define sk_incoming_cpu __sk_common.skc_incoming_cpu
|
||||
#define sk_flags __sk_common.skc_flags
|
||||
#define sk_rxhash __sk_common.skc_rxhash
|
||||
|
||||
socket_lock_t sk_lock;
|
||||
struct sk_buff_head sk_receive_queue;
|
||||
@@ -350,14 +374,6 @@ struct sock {
|
||||
} sk_backlog;
|
||||
#define sk_rmem_alloc sk_backlog.rmem_alloc
|
||||
int sk_forward_alloc;
|
||||
#ifdef CONFIG_RPS
|
||||
__u32 sk_rxhash;
|
||||
#endif
|
||||
u16 sk_incoming_cpu;
|
||||
/* 16bit hole
|
||||
* Warned : sk_incoming_cpu can be set from softirq,
|
||||
* Do not use this hole without fully understanding possible issues.
|
||||
*/
|
||||
|
||||
__u32 sk_txhash;
|
||||
#ifdef CONFIG_NET_RX_BUSY_POLL
|
||||
@@ -373,7 +389,6 @@ struct sock {
|
||||
#ifdef CONFIG_XFRM
|
||||
struct xfrm_policy *sk_policy[2];
|
||||
#endif
|
||||
unsigned long sk_flags;
|
||||
struct dst_entry *sk_rx_dst;
|
||||
struct dst_entry __rcu *sk_dst_cache;
|
||||
spinlock_t sk_dst_lock;
|
||||
@@ -1514,6 +1529,13 @@ void sock_kfree_s(struct sock *sk, void *mem, int size);
|
||||
void sock_kzfree_s(struct sock *sk, void *mem, int size);
|
||||
void sk_send_sigurg(struct sock *sk);
|
||||
|
||||
struct sockcm_cookie {
|
||||
u32 mark;
|
||||
};
|
||||
|
||||
int sock_cmsg_send(struct sock *sk, struct msghdr *msg,
|
||||
struct sockcm_cookie *sockc);
|
||||
|
||||
/*
|
||||
* Functions to fill in entries in struct proto_ops when a protocol
|
||||
* does not implement a particular function.
|
||||
@@ -2201,6 +2223,14 @@ static inline bool sk_fullsock(const struct sock *sk)
|
||||
return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT | TCPF_NEW_SYN_RECV);
|
||||
}
|
||||
|
||||
/* This helper checks if a socket is a LISTEN or NEW_SYN_RECV
|
||||
* SYNACK messages can be attached to either ones (depending on SYNCOOKIE)
|
||||
*/
|
||||
static inline bool sk_listener(const struct sock *sk)
|
||||
{
|
||||
return (1 << sk->sk_state) & (TCPF_LISTEN | TCPF_NEW_SYN_RECV);
|
||||
}
|
||||
|
||||
void sock_enable_timestamp(struct sock *sk, int flag);
|
||||
int sock_get_timestamp(struct sock *, struct timeval __user *);
|
||||
int sock_get_timestampns(struct sock *, struct timespec __user *);
|
||||
|
@@ -14,8 +14,11 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/list.h>
|
||||
#include <net/ip_fib.h>
|
||||
|
||||
#define SWITCHDEV_F_NO_RECURSE BIT(0)
|
||||
#define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1)
|
||||
#define SWITCHDEV_F_DEFER BIT(2)
|
||||
|
||||
struct switchdev_trans_item {
|
||||
struct list_head list;
|
||||
@@ -43,6 +46,7 @@ enum switchdev_attr_id {
|
||||
SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
|
||||
SWITCHDEV_ATTR_ID_PORT_STP_STATE,
|
||||
SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
|
||||
SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
|
||||
};
|
||||
|
||||
struct switchdev_attr {
|
||||
@@ -52,11 +56,10 @@ struct switchdev_attr {
|
||||
struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
|
||||
u8 stp_state; /* PORT_STP_STATE */
|
||||
unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */
|
||||
u32 ageing_time; /* BRIDGE_AGEING_TIME */
|
||||
} u;
|
||||
};
|
||||
|
||||
struct fib_info;
|
||||
|
||||
enum switchdev_obj_id {
|
||||
SWITCHDEV_OBJ_ID_UNDEFINED,
|
||||
SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
@@ -66,6 +69,7 @@ enum switchdev_obj_id {
|
||||
|
||||
struct switchdev_obj {
|
||||
enum switchdev_obj_id id;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/* SWITCHDEV_OBJ_ID_PORT_VLAN */
|
||||
@@ -84,7 +88,7 @@ struct switchdev_obj_ipv4_fib {
|
||||
struct switchdev_obj obj;
|
||||
u32 dst;
|
||||
int dst_len;
|
||||
struct fib_info *fi;
|
||||
struct fib_info fi;
|
||||
u8 tos;
|
||||
u8 type;
|
||||
u32 nlflags;
|
||||
@@ -97,7 +101,7 @@ struct switchdev_obj_ipv4_fib {
|
||||
/* SWITCHDEV_OBJ_ID_PORT_FDB */
|
||||
struct switchdev_obj_port_fdb {
|
||||
struct switchdev_obj obj;
|
||||
const unsigned char *addr;
|
||||
unsigned char addr[ETH_ALEN];
|
||||
u16 vid;
|
||||
u16 ndm_state;
|
||||
};
|
||||
@@ -129,7 +133,7 @@ struct switchdev_ops {
|
||||
int (*switchdev_port_attr_get)(struct net_device *dev,
|
||||
struct switchdev_attr *attr);
|
||||
int (*switchdev_port_attr_set)(struct net_device *dev,
|
||||
struct switchdev_attr *attr,
|
||||
const struct switchdev_attr *attr,
|
||||
struct switchdev_trans *trans);
|
||||
int (*switchdev_port_obj_add)(struct net_device *dev,
|
||||
const struct switchdev_obj *obj,
|
||||
@@ -164,10 +168,11 @@ switchdev_notifier_info_to_dev(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,
|
||||
struct switchdev_attr *attr);
|
||||
const struct switchdev_attr *attr);
|
||||
int switchdev_port_obj_add(struct net_device *dev,
|
||||
const struct switchdev_obj *obj);
|
||||
int switchdev_port_obj_del(struct net_device *dev,
|
||||
@@ -205,6 +210,10 @@ void switchdev_port_fwd_mark_set(struct net_device *dev,
|
||||
|
||||
#else
|
||||
|
||||
static inline void switchdev_deferred_process(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int switchdev_port_attr_get(struct net_device *dev,
|
||||
struct switchdev_attr *attr)
|
||||
{
|
||||
@@ -212,7 +221,7 @@ static inline int switchdev_port_attr_get(struct net_device *dev,
|
||||
}
|
||||
|
||||
static inline int switchdev_port_attr_set(struct net_device *dev,
|
||||
struct switchdev_attr *attr)
|
||||
const struct switchdev_attr *attr)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@@ -333,7 +333,7 @@ struct xfrm_state_afinfo {
|
||||
const xfrm_address_t *saddr);
|
||||
int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
|
||||
int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
|
||||
int (*output)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int (*output_finish)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*extract_input)(struct xfrm_state *x,
|
||||
struct sk_buff *skb);
|
||||
@@ -1527,7 +1527,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
|
||||
|
||||
int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm4_output(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm4_output_finish(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm4_rcv_cb(struct sk_buff *skb, u8 protocol, int err);
|
||||
int xfrm4_protocol_register(struct xfrm4_protocol *handler, unsigned char protocol);
|
||||
@@ -1552,7 +1552,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
|
||||
__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
|
||||
int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm6_output(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
|
||||
u8 **prevhdr);
|
||||
|
Reference in New Issue
Block a user