diff options
Diffstat (limited to 'include/linux')
36 files changed, 1173 insertions, 809 deletions
diff --git a/include/linux/crc32.h b/include/linux/crc32.h index 68267b64bb98..7d275c4fc011 100644 --- a/include/linux/crc32.h +++ b/include/linux/crc32.h | |||
| @@ -11,8 +11,48 @@ | |||
| 11 | extern u32 crc32_le(u32 crc, unsigned char const *p, size_t len); | 11 | extern u32 crc32_le(u32 crc, unsigned char const *p, size_t len); |
| 12 | extern u32 crc32_be(u32 crc, unsigned char const *p, size_t len); | 12 | extern u32 crc32_be(u32 crc, unsigned char const *p, size_t len); |
| 13 | 13 | ||
| 14 | /** | ||
| 15 | * crc32_le_combine - Combine two crc32 check values into one. For two | ||
| 16 | * sequences of bytes, seq1 and seq2 with lengths len1 | ||
| 17 | * and len2, crc32_le() check values were calculated | ||
| 18 | * for each, crc1 and crc2. | ||
| 19 | * | ||
| 20 | * @crc1: crc32 of the first block | ||
| 21 | * @crc2: crc32 of the second block | ||
| 22 | * @len2: length of the second block | ||
| 23 | * | ||
| 24 | * Return: The crc32_le() check value of seq1 and seq2 concatenated, | ||
| 25 | * requiring only crc1, crc2, and len2. Note: If seq_full denotes | ||
| 26 | * the concatenated memory area of seq1 with seq2, and crc_full | ||
| 27 | * the crc32_le() value of seq_full, then crc_full == | ||
| 28 | * crc32_le_combine(crc1, crc2, len2) when crc_full was seeded | ||
| 29 | * with the same initializer as crc1, and crc2 seed was 0. See | ||
| 30 | * also crc32_combine_test(). | ||
| 31 | */ | ||
| 32 | extern u32 crc32_le_combine(u32 crc1, u32 crc2, size_t len2); | ||
| 33 | |||
| 14 | extern u32 __crc32c_le(u32 crc, unsigned char const *p, size_t len); | 34 | extern u32 __crc32c_le(u32 crc, unsigned char const *p, size_t len); |
| 15 | 35 | ||
| 36 | /** | ||
| 37 | * __crc32c_le_combine - Combine two crc32c check values into one. For two | ||
| 38 | * sequences of bytes, seq1 and seq2 with lengths len1 | ||
| 39 | * and len2, __crc32c_le() check values were calculated | ||
| 40 | * for each, crc1 and crc2. | ||
| 41 | * | ||
| 42 | * @crc1: crc32c of the first block | ||
| 43 | * @crc2: crc32c of the second block | ||
| 44 | * @len2: length of the second block | ||
| 45 | * | ||
| 46 | * Return: The __crc32c_le() check value of seq1 and seq2 concatenated, | ||
| 47 | * requiring only crc1, crc2, and len2. Note: If seq_full denotes | ||
| 48 | * the concatenated memory area of seq1 with seq2, and crc_full | ||
| 49 | * the __crc32c_le() value of seq_full, then crc_full == | ||
| 50 | * __crc32c_le_combine(crc1, crc2, len2) when crc_full was | ||
| 51 | * seeded with the same initializer as crc1, and crc2 seed | ||
| 52 | * was 0. See also crc32c_combine_test(). | ||
| 53 | */ | ||
| 54 | extern u32 __crc32c_le_combine(u32 crc1, u32 crc2, size_t len2); | ||
| 55 | |||
| 16 | #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length) | 56 | #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length) |
| 17 | 57 | ||
| 18 | /* | 58 | /* |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index d8b512496e50..fc4a9aa7dd82 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
| @@ -28,27 +28,24 @@ | |||
| 28 | #include <asm/unaligned.h> | 28 | #include <asm/unaligned.h> |
| 29 | 29 | ||
| 30 | #ifdef __KERNEL__ | 30 | #ifdef __KERNEL__ |
| 31 | extern __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); | 31 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); |
| 32 | extern const struct header_ops eth_header_ops; | 32 | extern const struct header_ops eth_header_ops; |
| 33 | 33 | ||
| 34 | extern int eth_header(struct sk_buff *skb, struct net_device *dev, | 34 | int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, |
| 35 | unsigned short type, | 35 | const void *daddr, const void *saddr, unsigned len); |
| 36 | const void *daddr, const void *saddr, unsigned len); | 36 | int eth_rebuild_header(struct sk_buff *skb); |
| 37 | extern int eth_rebuild_header(struct sk_buff *skb); | 37 | int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); |
| 38 | extern int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); | 38 | int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, |
| 39 | extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, __be16 type); | 39 | __be16 type); |
| 40 | extern void eth_header_cache_update(struct hh_cache *hh, | 40 | void eth_header_cache_update(struct hh_cache *hh, const struct net_device *dev, |
| 41 | const struct net_device *dev, | 41 | const unsigned char *haddr); |
| 42 | const unsigned char *haddr); | 42 | int eth_prepare_mac_addr_change(struct net_device *dev, void *p); |
| 43 | extern int eth_prepare_mac_addr_change(struct net_device *dev, void *p); | 43 | void eth_commit_mac_addr_change(struct net_device *dev, void *p); |
| 44 | extern void eth_commit_mac_addr_change(struct net_device *dev, void *p); | 44 | int eth_mac_addr(struct net_device *dev, void *p); |
| 45 | extern int eth_mac_addr(struct net_device *dev, void *p); | 45 | int eth_change_mtu(struct net_device *dev, int new_mtu); |
| 46 | extern int eth_change_mtu(struct net_device *dev, int new_mtu); | 46 | int eth_validate_addr(struct net_device *dev); |
| 47 | extern int eth_validate_addr(struct net_device *dev); | 47 | |
| 48 | 48 | struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs, | |
| 49 | |||
| 50 | |||
| 51 | extern struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs, | ||
| 52 | unsigned int rxqs); | 49 | unsigned int rxqs); |
| 53 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) | 50 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) |
| 54 | #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count) | 51 | #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count) |
diff --git a/include/linux/fcdevice.h b/include/linux/fcdevice.h index e460ef831984..5009fa16b5d8 100644 --- a/include/linux/fcdevice.h +++ b/include/linux/fcdevice.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include <linux/if_fc.h> | 27 | #include <linux/if_fc.h> |
| 28 | 28 | ||
| 29 | #ifdef __KERNEL__ | 29 | #ifdef __KERNEL__ |
| 30 | extern struct net_device *alloc_fcdev(int sizeof_priv); | 30 | struct net_device *alloc_fcdev(int sizeof_priv); |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #endif /* _LINUX_FCDEVICE_H */ | 33 | #endif /* _LINUX_FCDEVICE_H */ |
diff --git a/include/linux/fddidevice.h b/include/linux/fddidevice.h index 155bafd9e886..9a79f0106da1 100644 --- a/include/linux/fddidevice.h +++ b/include/linux/fddidevice.h | |||
| @@ -25,10 +25,9 @@ | |||
| 25 | #include <linux/if_fddi.h> | 25 | #include <linux/if_fddi.h> |
| 26 | 26 | ||
| 27 | #ifdef __KERNEL__ | 27 | #ifdef __KERNEL__ |
| 28 | extern __be16 fddi_type_trans(struct sk_buff *skb, | 28 | __be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev); |
| 29 | struct net_device *dev); | 29 | int fddi_change_mtu(struct net_device *dev, int new_mtu); |
| 30 | extern int fddi_change_mtu(struct net_device *dev, int new_mtu); | 30 | struct net_device *alloc_fddidev(int sizeof_priv); |
| 31 | extern struct net_device *alloc_fddidev(int sizeof_priv); | ||
| 32 | #endif | 31 | #endif |
| 33 | 32 | ||
| 34 | #endif /* _LINUX_FDDIDEVICE_H */ | 33 | #endif /* _LINUX_FDDIDEVICE_H */ |
diff --git a/include/linux/hippidevice.h b/include/linux/hippidevice.h index f148e4908410..8ec23fb0b412 100644 --- a/include/linux/hippidevice.h +++ b/include/linux/hippidevice.h | |||
| @@ -31,11 +31,11 @@ struct hippi_cb { | |||
| 31 | __u32 ifield; | 31 | __u32 ifield; |
| 32 | }; | 32 | }; |
| 33 | 33 | ||
| 34 | extern __be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev); | 34 | __be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev); |
| 35 | extern int hippi_change_mtu(struct net_device *dev, int new_mtu); | 35 | int hippi_change_mtu(struct net_device *dev, int new_mtu); |
| 36 | extern int hippi_mac_addr(struct net_device *dev, void *p); | 36 | int hippi_mac_addr(struct net_device *dev, void *p); |
| 37 | extern int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p); | 37 | int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p); |
| 38 | extern struct net_device *alloc_hippi_dev(int sizeof_priv); | 38 | struct net_device *alloc_hippi_dev(int sizeof_priv); |
| 39 | #endif | 39 | #endif |
| 40 | 40 | ||
| 41 | #endif /* _LINUX_HIPPIDEVICE_H */ | 41 | #endif /* _LINUX_HIPPIDEVICE_H */ |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index a5b598a79bec..8c3b26a21574 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -697,6 +697,18 @@ struct ieee80211_sec_chan_offs_ie { | |||
| 697 | } __packed; | 697 | } __packed; |
| 698 | 698 | ||
| 699 | /** | 699 | /** |
| 700 | * struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE | ||
| 701 | * | ||
| 702 | * This structure represents the "Mesh Channel Switch Paramters element" | ||
| 703 | */ | ||
| 704 | struct ieee80211_mesh_chansw_params_ie { | ||
| 705 | u8 mesh_ttl; | ||
| 706 | u8 mesh_flags; | ||
| 707 | __le16 mesh_reason; | ||
| 708 | __le16 mesh_pre_value; | ||
| 709 | } __packed; | ||
| 710 | |||
| 711 | /** | ||
| 700 | * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE | 712 | * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE |
| 701 | */ | 713 | */ |
| 702 | struct ieee80211_wide_bw_chansw_ie { | 714 | struct ieee80211_wide_bw_chansw_ie { |
| @@ -751,6 +763,14 @@ enum mesh_config_capab_flags { | |||
| 751 | }; | 763 | }; |
| 752 | 764 | ||
| 753 | /** | 765 | /** |
| 766 | * mesh channel switch parameters element's flag indicator | ||
| 767 | * | ||
| 768 | */ | ||
| 769 | #define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0) | ||
| 770 | #define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1) | ||
| 771 | #define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2) | ||
| 772 | |||
| 773 | /** | ||
| 754 | * struct ieee80211_rann_ie | 774 | * struct ieee80211_rann_ie |
| 755 | * | 775 | * |
| 756 | * This structure refers to "Root Announcement information element" | 776 | * This structure refers to "Root Announcement information element" |
| @@ -1391,8 +1411,8 @@ struct ieee80211_vht_operation { | |||
| 1391 | #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 | 1411 | #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 |
| 1392 | #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800 | 1412 | #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800 |
| 1393 | #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000 | 1413 | #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000 |
| 1394 | #define IEEE80211_VHT_CAP_BEAMFORMER_ANTENNAS_MAX 0x00006000 | 1414 | #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MAX 0x0000e000 |
| 1395 | #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MAX 0x00030000 | 1415 | #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MAX 0x00070000 |
| 1396 | #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000 | 1416 | #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000 |
| 1397 | #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000 | 1417 | #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000 |
| 1398 | #define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000 | 1418 | #define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000 |
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index ddd33fd5904d..c2702856295e 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h | |||
| @@ -61,6 +61,7 @@ struct macvlan_dev { | |||
| 61 | struct hlist_node hlist; | 61 | struct hlist_node hlist; |
| 62 | struct macvlan_port *port; | 62 | struct macvlan_port *port; |
| 63 | struct net_device *lowerdev; | 63 | struct net_device *lowerdev; |
| 64 | void *fwd_priv; | ||
| 64 | struct macvlan_pcpu_stats __percpu *pcpu_stats; | 65 | struct macvlan_pcpu_stats __percpu *pcpu_stats; |
| 65 | 66 | ||
| 66 | DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ); | 67 | DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ); |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 715c343f7c00..f252deb99454 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -89,6 +89,101 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev, | |||
| 89 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); | 89 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
| 90 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); | 90 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
| 91 | 91 | ||
| 92 | /** | ||
| 93 | * struct vlan_priority_tci_mapping - vlan egress priority mappings | ||
| 94 | * @priority: skb priority | ||
| 95 | * @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000 | ||
| 96 | * @next: pointer to next struct | ||
| 97 | */ | ||
| 98 | struct vlan_priority_tci_mapping { | ||
| 99 | u32 priority; | ||
| 100 | u16 vlan_qos; | ||
| 101 | struct vlan_priority_tci_mapping *next; | ||
| 102 | }; | ||
| 103 | |||
| 104 | /** | ||
| 105 | * struct vlan_pcpu_stats - VLAN percpu rx/tx stats | ||
| 106 | * @rx_packets: number of received packets | ||
| 107 | * @rx_bytes: number of received bytes | ||
| 108 | * @rx_multicast: number of received multicast packets | ||
| 109 | * @tx_packets: number of transmitted packets | ||
| 110 | * @tx_bytes: number of transmitted bytes | ||
| 111 | * @syncp: synchronization point for 64bit counters | ||
| 112 | * @rx_errors: number of rx errors | ||
| 113 | * @tx_dropped: number of tx drops | ||
| 114 | */ | ||
| 115 | struct vlan_pcpu_stats { | ||
| 116 | u64 rx_packets; | ||
| 117 | u64 rx_bytes; | ||
| 118 | u64 rx_multicast; | ||
| 119 | u64 tx_packets; | ||
| 120 | u64 tx_bytes; | ||
| 121 | struct u64_stats_sync syncp; | ||
| 122 | u32 rx_errors; | ||
| 123 | u32 tx_dropped; | ||
| 124 | }; | ||
| 125 | |||
| 126 | struct proc_dir_entry; | ||
| 127 | struct netpoll; | ||
| 128 | |||
| 129 | /** | ||
| 130 | * struct vlan_dev_priv - VLAN private device data | ||
| 131 | * @nr_ingress_mappings: number of ingress priority mappings | ||
| 132 | * @ingress_priority_map: ingress priority mappings | ||
| 133 | * @nr_egress_mappings: number of egress priority mappings | ||
| 134 | * @egress_priority_map: hash of egress priority mappings | ||
| 135 | * @vlan_proto: VLAN encapsulation protocol | ||
| 136 | * @vlan_id: VLAN identifier | ||
| 137 | * @flags: device flags | ||
| 138 | * @real_dev: underlying netdevice | ||
| 139 | * @real_dev_addr: address of underlying netdevice | ||
| 140 | * @dent: proc dir entry | ||
| 141 | * @vlan_pcpu_stats: ptr to percpu rx stats | ||
| 142 | */ | ||
| 143 | struct vlan_dev_priv { | ||
| 144 | unsigned int nr_ingress_mappings; | ||
| 145 | u32 ingress_priority_map[8]; | ||
| 146 | unsigned int nr_egress_mappings; | ||
| 147 | struct vlan_priority_tci_mapping *egress_priority_map[16]; | ||
| 148 | |||
| 149 | __be16 vlan_proto; | ||
| 150 | u16 vlan_id; | ||
| 151 | u16 flags; | ||
| 152 | |||
| 153 | struct net_device *real_dev; | ||
| 154 | unsigned char real_dev_addr[ETH_ALEN]; | ||
| 155 | |||
| 156 | struct proc_dir_entry *dent; | ||
| 157 | struct vlan_pcpu_stats __percpu *vlan_pcpu_stats; | ||
| 158 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 159 | struct netpoll *netpoll; | ||
| 160 | #endif | ||
| 161 | }; | ||
| 162 | |||
| 163 | static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev) | ||
| 164 | { | ||
| 165 | return netdev_priv(dev); | ||
| 166 | } | ||
| 167 | |||
| 168 | static inline u16 | ||
| 169 | vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio) | ||
| 170 | { | ||
| 171 | struct vlan_priority_tci_mapping *mp; | ||
| 172 | |||
| 173 | smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */ | ||
| 174 | |||
| 175 | mp = vlan_dev_priv(dev)->egress_priority_map[(skprio & 0xF)]; | ||
| 176 | while (mp) { | ||
| 177 | if (mp->priority == skprio) { | ||
| 178 | return mp->vlan_qos; /* This should already be shifted | ||
| 179 | * to mask correctly with the | ||
| 180 | * VLAN's TCI */ | ||
| 181 | } | ||
| 182 | mp = mp->next; | ||
| 183 | } | ||
| 184 | return 0; | ||
| 185 | } | ||
| 186 | |||
| 92 | extern bool vlan_do_receive(struct sk_buff **skb); | 187 | extern bool vlan_do_receive(struct sk_buff **skb); |
| 93 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); | 188 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); |
| 94 | 189 | ||
| @@ -121,6 +216,12 @@ static inline u16 vlan_dev_vlan_id(const struct net_device *dev) | |||
| 121 | return 0; | 216 | return 0; |
| 122 | } | 217 | } |
| 123 | 218 | ||
| 219 | static inline u16 vlan_dev_get_egress_qos_mask(struct net_device *dev, | ||
| 220 | u32 skprio) | ||
| 221 | { | ||
| 222 | return 0; | ||
| 223 | } | ||
| 224 | |||
| 124 | static inline bool vlan_do_receive(struct sk_buff **skb) | 225 | static inline bool vlan_do_receive(struct sk_buff **skb) |
| 125 | { | 226 | { |
| 126 | return false; | 227 | return false; |
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index 79640e015a86..0d678aefe69d 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
| @@ -147,25 +147,27 @@ struct in_ifaddr { | |||
| 147 | unsigned long ifa_tstamp; /* updated timestamp */ | 147 | unsigned long ifa_tstamp; /* updated timestamp */ |
| 148 | }; | 148 | }; |
| 149 | 149 | ||
| 150 | extern int register_inetaddr_notifier(struct notifier_block *nb); | 150 | int register_inetaddr_notifier(struct notifier_block *nb); |
| 151 | extern int unregister_inetaddr_notifier(struct notifier_block *nb); | 151 | int unregister_inetaddr_notifier(struct notifier_block *nb); |
| 152 | 152 | ||
| 153 | extern void inet_netconf_notify_devconf(struct net *net, int type, int ifindex, | 153 | void inet_netconf_notify_devconf(struct net *net, int type, int ifindex, |
| 154 | struct ipv4_devconf *devconf); | 154 | struct ipv4_devconf *devconf); |
| 155 | 155 | ||
| 156 | extern struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref); | 156 | struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref); |
| 157 | static inline struct net_device *ip_dev_find(struct net *net, __be32 addr) | 157 | static inline struct net_device *ip_dev_find(struct net *net, __be32 addr) |
| 158 | { | 158 | { |
| 159 | return __ip_dev_find(net, addr, true); | 159 | return __ip_dev_find(net, addr, true); |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); | 162 | int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); |
| 163 | extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); | 163 | int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); |
| 164 | extern void devinet_init(void); | 164 | void devinet_init(void); |
| 165 | extern struct in_device *inetdev_by_index(struct net *, int); | 165 | struct in_device *inetdev_by_index(struct net *, int); |
| 166 | extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope); | 166 | __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope); |
| 167 | extern __be32 inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local, int scope); | 167 | __be32 inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local, |
| 168 | extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, __be32 mask); | 168 | int scope); |
| 169 | struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, | ||
| 170 | __be32 mask); | ||
| 169 | 171 | ||
| 170 | static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa) | 172 | static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa) |
| 171 | { | 173 | { |
| @@ -218,7 +220,7 @@ static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev) | |||
| 218 | return rtnl_dereference(dev->ip_ptr); | 220 | return rtnl_dereference(dev->ip_ptr); |
| 219 | } | 221 | } |
| 220 | 222 | ||
| 221 | extern void in_dev_finish_destroy(struct in_device *idev); | 223 | void in_dev_finish_destroy(struct in_device *idev); |
| 222 | 224 | ||
| 223 | static inline void in_dev_put(struct in_device *idev) | 225 | static inline void in_dev_put(struct in_device *idev) |
| 224 | { | 226 | { |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 28ea38439313..5d89d1b808a6 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -21,13 +21,11 @@ struct ipv6_devconf { | |||
| 21 | __s32 force_mld_version; | 21 | __s32 force_mld_version; |
| 22 | __s32 mldv1_unsolicited_report_interval; | 22 | __s32 mldv1_unsolicited_report_interval; |
| 23 | __s32 mldv2_unsolicited_report_interval; | 23 | __s32 mldv2_unsolicited_report_interval; |
| 24 | #ifdef CONFIG_IPV6_PRIVACY | ||
| 25 | __s32 use_tempaddr; | 24 | __s32 use_tempaddr; |
| 26 | __s32 temp_valid_lft; | 25 | __s32 temp_valid_lft; |
| 27 | __s32 temp_prefered_lft; | 26 | __s32 temp_prefered_lft; |
| 28 | __s32 regen_max_retry; | 27 | __s32 regen_max_retry; |
| 29 | __s32 max_desync_factor; | 28 | __s32 max_desync_factor; |
| 30 | #endif | ||
| 31 | __s32 max_addresses; | 29 | __s32 max_addresses; |
| 32 | __s32 accept_ra_defrtr; | 30 | __s32 accept_ra_defrtr; |
| 33 | __s32 accept_ra_pinfo; | 31 | __s32 accept_ra_pinfo; |
| @@ -115,16 +113,8 @@ static inline int inet6_iif(const struct sk_buff *skb) | |||
| 115 | return IP6CB(skb)->iif; | 113 | return IP6CB(skb)->iif; |
| 116 | } | 114 | } |
| 117 | 115 | ||
| 118 | struct inet6_request_sock { | ||
| 119 | struct in6_addr loc_addr; | ||
| 120 | struct in6_addr rmt_addr; | ||
| 121 | struct sk_buff *pktopts; | ||
| 122 | int iif; | ||
| 123 | }; | ||
| 124 | |||
| 125 | struct tcp6_request_sock { | 116 | struct tcp6_request_sock { |
| 126 | struct tcp_request_sock tcp6rsk_tcp; | 117 | struct tcp_request_sock tcp6rsk_tcp; |
| 127 | struct inet6_request_sock tcp6rsk_inet6; | ||
| 128 | }; | 118 | }; |
| 129 | 119 | ||
| 130 | struct ipv6_mc_socklist; | 120 | struct ipv6_mc_socklist; |
| @@ -141,8 +131,6 @@ struct ipv6_fl_socklist; | |||
| 141 | */ | 131 | */ |
| 142 | struct ipv6_pinfo { | 132 | struct ipv6_pinfo { |
| 143 | struct in6_addr saddr; | 133 | struct in6_addr saddr; |
| 144 | struct in6_addr rcv_saddr; | ||
| 145 | struct in6_addr daddr; | ||
| 146 | struct in6_pktinfo sticky_pktinfo; | 134 | struct in6_pktinfo sticky_pktinfo; |
| 147 | const struct in6_addr *daddr_cache; | 135 | const struct in6_addr *daddr_cache; |
| 148 | #ifdef CONFIG_IPV6_SUBTREES | 136 | #ifdef CONFIG_IPV6_SUBTREES |
| @@ -256,48 +244,22 @@ struct tcp6_sock { | |||
| 256 | 244 | ||
| 257 | extern int inet6_sk_rebuild_header(struct sock *sk); | 245 | extern int inet6_sk_rebuild_header(struct sock *sk); |
| 258 | 246 | ||
| 259 | struct inet6_timewait_sock { | ||
| 260 | struct in6_addr tw_v6_daddr; | ||
| 261 | struct in6_addr tw_v6_rcv_saddr; | ||
| 262 | }; | ||
| 263 | |||
| 264 | struct tcp6_timewait_sock { | 247 | struct tcp6_timewait_sock { |
| 265 | struct tcp_timewait_sock tcp6tw_tcp; | 248 | struct tcp_timewait_sock tcp6tw_tcp; |
| 266 | struct inet6_timewait_sock tcp6tw_inet6; | ||
| 267 | }; | 249 | }; |
| 268 | 250 | ||
| 269 | static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk) | ||
| 270 | { | ||
| 271 | return (struct inet6_timewait_sock *)(((u8 *)sk) + | ||
| 272 | inet_twsk(sk)->tw_ipv6_offset); | ||
| 273 | } | ||
| 274 | |||
| 275 | #if IS_ENABLED(CONFIG_IPV6) | 251 | #if IS_ENABLED(CONFIG_IPV6) |
| 276 | static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) | 252 | static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) |
| 277 | { | 253 | { |
| 278 | return inet_sk(__sk)->pinet6; | 254 | return inet_sk(__sk)->pinet6; |
| 279 | } | 255 | } |
| 280 | 256 | ||
| 281 | static inline struct inet6_request_sock * | ||
| 282 | inet6_rsk(const struct request_sock *rsk) | ||
| 283 | { | ||
| 284 | return (struct inet6_request_sock *)(((u8 *)rsk) + | ||
| 285 | inet_rsk(rsk)->inet6_rsk_offset); | ||
| 286 | } | ||
| 287 | |||
| 288 | static inline u32 inet6_rsk_offset(struct request_sock *rsk) | ||
| 289 | { | ||
| 290 | return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock); | ||
| 291 | } | ||
| 292 | |||
| 293 | static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops) | 257 | static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops) |
| 294 | { | 258 | { |
| 295 | struct request_sock *req = reqsk_alloc(ops); | 259 | struct request_sock *req = reqsk_alloc(ops); |
| 296 | 260 | ||
| 297 | if (req != NULL) { | 261 | if (req) |
| 298 | inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req); | 262 | inet_rsk(req)->pktopts = NULL; |
| 299 | inet6_rsk(req)->pktopts = NULL; | ||
| 300 | } | ||
| 301 | 263 | ||
| 302 | return req; | 264 | return req; |
| 303 | } | 265 | } |
| @@ -321,21 +283,11 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to, | |||
| 321 | #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) | 283 | #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) |
| 322 | #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) | 284 | #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) |
| 323 | 285 | ||
| 324 | static inline u16 inet6_tw_offset(const struct proto *prot) | 286 | static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk) |
| 325 | { | 287 | { |
| 326 | return prot->twsk_prot->twsk_obj_size - | 288 | if (sk->sk_family == AF_INET6) |
| 327 | sizeof(struct inet6_timewait_sock); | 289 | return &sk->sk_v6_rcv_saddr; |
| 328 | } | 290 | return NULL; |
| 329 | |||
| 330 | static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk) | ||
| 331 | { | ||
| 332 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
| 333 | &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr; | ||
| 334 | } | ||
| 335 | |||
| 336 | static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk) | ||
| 337 | { | ||
| 338 | return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL; | ||
| 339 | } | 291 | } |
| 340 | 292 | ||
| 341 | static inline int inet_v6_ipv6only(const struct sock *sk) | 293 | static inline int inet_v6_ipv6only(const struct sock *sk) |
| @@ -363,28 +315,18 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk) | |||
| 363 | return NULL; | 315 | return NULL; |
| 364 | } | 316 | } |
| 365 | 317 | ||
| 366 | #define __inet6_rcv_saddr(__sk) NULL | ||
| 367 | #define inet6_rcv_saddr(__sk) NULL | 318 | #define inet6_rcv_saddr(__sk) NULL |
| 368 | #define tcp_twsk_ipv6only(__sk) 0 | 319 | #define tcp_twsk_ipv6only(__sk) 0 |
| 369 | #define inet_v6_ipv6only(__sk) 0 | 320 | #define inet_v6_ipv6only(__sk) 0 |
| 370 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 321 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
| 371 | 322 | ||
| 372 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ | 323 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ |
| 373 | ((inet_sk(__sk)->inet_portpair == (__ports)) && \ | 324 | (((__sk)->sk_portpair == (__ports)) && \ |
| 374 | ((__sk)->sk_family == AF_INET6) && \ | 325 | ((__sk)->sk_family == AF_INET6) && \ |
| 375 | ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ | 326 | ipv6_addr_equal(&(__sk)->sk_v6_daddr, (__saddr)) && \ |
| 376 | ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ | 327 | ipv6_addr_equal(&(__sk)->sk_v6_rcv_saddr, (__daddr)) && \ |
| 377 | (!(__sk)->sk_bound_dev_if || \ | 328 | (!(__sk)->sk_bound_dev_if || \ |
| 378 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | 329 | ((__sk)->sk_bound_dev_if == (__dif))) && \ |
| 379 | net_eq(sock_net(__sk), (__net))) | 330 | net_eq(sock_net(__sk), (__net))) |
| 380 | 331 | ||
| 381 | #define INET6_TW_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ | ||
| 382 | ((inet_twsk(__sk)->tw_portpair == (__ports)) && \ | ||
| 383 | ((__sk)->sk_family == AF_INET6) && \ | ||
| 384 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)) && \ | ||
| 385 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr)) && \ | ||
| 386 | (!(__sk)->sk_bound_dev_if || \ | ||
| 387 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | ||
| 388 | net_eq(sock_net(__sk), (__net))) | ||
| 389 | |||
| 390 | #endif /* _IPV6_H */ | 332 | #endif /* _IPV6_H */ |
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index cf08540d6204..39999775b922 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h | |||
| @@ -48,6 +48,13 @@ | |||
| 48 | 48 | ||
| 49 | #include <linux/types.h> | 49 | #include <linux/types.h> |
| 50 | #include <linux/compiler.h> | 50 | #include <linux/compiler.h> |
| 51 | #include <linux/bug.h> | ||
| 52 | |||
| 53 | extern bool static_key_initialized; | ||
| 54 | |||
| 55 | #define STATIC_KEY_CHECK_USE() WARN(!static_key_initialized, \ | ||
| 56 | "%s used before call to jump_label_init", \ | ||
| 57 | __func__) | ||
| 51 | 58 | ||
| 52 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) | 59 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) |
| 53 | 60 | ||
| @@ -128,6 +135,7 @@ struct static_key { | |||
| 128 | 135 | ||
| 129 | static __always_inline void jump_label_init(void) | 136 | static __always_inline void jump_label_init(void) |
| 130 | { | 137 | { |
| 138 | static_key_initialized = true; | ||
| 131 | } | 139 | } |
| 132 | 140 | ||
| 133 | static __always_inline bool static_key_false(struct static_key *key) | 141 | static __always_inline bool static_key_false(struct static_key *key) |
| @@ -146,11 +154,13 @@ static __always_inline bool static_key_true(struct static_key *key) | |||
| 146 | 154 | ||
| 147 | static inline void static_key_slow_inc(struct static_key *key) | 155 | static inline void static_key_slow_inc(struct static_key *key) |
| 148 | { | 156 | { |
| 157 | STATIC_KEY_CHECK_USE(); | ||
| 149 | atomic_inc(&key->enabled); | 158 | atomic_inc(&key->enabled); |
| 150 | } | 159 | } |
| 151 | 160 | ||
| 152 | static inline void static_key_slow_dec(struct static_key *key) | 161 | static inline void static_key_slow_dec(struct static_key *key) |
| 153 | { | 162 | { |
| 163 | STATIC_KEY_CHECK_USE(); | ||
| 154 | atomic_dec(&key->enabled); | 164 | atomic_dec(&key->enabled); |
| 155 | } | 165 | } |
| 156 | 166 | ||
diff --git a/include/linux/jump_label_ratelimit.h b/include/linux/jump_label_ratelimit.h index 113788389b3d..089f70f83e97 100644 --- a/include/linux/jump_label_ratelimit.h +++ b/include/linux/jump_label_ratelimit.h | |||
| @@ -23,12 +23,14 @@ struct static_key_deferred { | |||
| 23 | }; | 23 | }; |
| 24 | static inline void static_key_slow_dec_deferred(struct static_key_deferred *key) | 24 | static inline void static_key_slow_dec_deferred(struct static_key_deferred *key) |
| 25 | { | 25 | { |
| 26 | STATIC_KEY_CHECK_USE(); | ||
| 26 | static_key_slow_dec(&key->key); | 27 | static_key_slow_dec(&key->key); |
| 27 | } | 28 | } |
| 28 | static inline void | 29 | static inline void |
| 29 | jump_label_rate_limit(struct static_key_deferred *key, | 30 | jump_label_rate_limit(struct static_key_deferred *key, |
| 30 | unsigned long rl) | 31 | unsigned long rl) |
| 31 | { | 32 | { |
| 33 | STATIC_KEY_CHECK_USE(); | ||
| 32 | } | 34 | } |
| 33 | #endif /* HAVE_JUMP_LABEL */ | 35 | #endif /* HAVE_JUMP_LABEL */ |
| 34 | #endif /* _LINUX_JUMP_LABEL_RATELIMIT_H */ | 36 | #endif /* _LINUX_JUMP_LABEL_RATELIMIT_H */ |
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index cd1fdf75103b..8df61bc5da00 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h | |||
| @@ -154,10 +154,6 @@ enum { | |||
| 154 | MLX4_CMD_QUERY_IF_STAT = 0X54, | 154 | MLX4_CMD_QUERY_IF_STAT = 0X54, |
| 155 | MLX4_CMD_SET_IF_STAT = 0X55, | 155 | MLX4_CMD_SET_IF_STAT = 0X55, |
| 156 | 156 | ||
| 157 | /* set port opcode modifiers */ | ||
| 158 | MLX4_SET_PORT_PRIO2TC = 0x8, | ||
| 159 | MLX4_SET_PORT_SCHEDULER = 0x9, | ||
| 160 | |||
| 161 | /* register/delete flow steering network rules */ | 157 | /* register/delete flow steering network rules */ |
| 162 | MLX4_QP_FLOW_STEERING_ATTACH = 0x65, | 158 | MLX4_QP_FLOW_STEERING_ATTACH = 0x65, |
| 163 | MLX4_QP_FLOW_STEERING_DETACH = 0x66, | 159 | MLX4_QP_FLOW_STEERING_DETACH = 0x66, |
| @@ -182,6 +178,8 @@ enum { | |||
| 182 | MLX4_SET_PORT_VLAN_TABLE = 0x3, | 178 | MLX4_SET_PORT_VLAN_TABLE = 0x3, |
| 183 | MLX4_SET_PORT_PRIO_MAP = 0x4, | 179 | MLX4_SET_PORT_PRIO_MAP = 0x4, |
| 184 | MLX4_SET_PORT_GID_TABLE = 0x5, | 180 | MLX4_SET_PORT_GID_TABLE = 0x5, |
| 181 | MLX4_SET_PORT_PRIO2TC = 0x8, | ||
| 182 | MLX4_SET_PORT_SCHEDULER = 0x9, | ||
| 185 | }; | 183 | }; |
| 186 | 184 | ||
| 187 | enum { | 185 | enum { |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 24ce6bdd540e..7d3a523160ba 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -54,6 +54,7 @@ enum { | |||
| 54 | MLX4_FLAG_MASTER = 1 << 2, | 54 | MLX4_FLAG_MASTER = 1 << 2, |
| 55 | MLX4_FLAG_SLAVE = 1 << 3, | 55 | MLX4_FLAG_SLAVE = 1 << 3, |
| 56 | MLX4_FLAG_SRIOV = 1 << 4, | 56 | MLX4_FLAG_SRIOV = 1 << 4, |
| 57 | MLX4_FLAG_OLD_REG_MAC = 1 << 6, | ||
| 57 | }; | 58 | }; |
| 58 | 59 | ||
| 59 | enum { | 60 | enum { |
| @@ -155,7 +156,7 @@ enum { | |||
| 155 | MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1, | 156 | MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1, |
| 156 | MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2, | 157 | MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2, |
| 157 | MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3, | 158 | MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3, |
| 158 | MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN = 1LL << 4, | 159 | MLX4_DEV_CAP_FLAG2_REASSIGN_MAC_EN = 1LL << 4, |
| 159 | MLX4_DEV_CAP_FLAG2_TS = 1LL << 5, | 160 | MLX4_DEV_CAP_FLAG2_TS = 1LL << 5, |
| 160 | MLX4_DEV_CAP_FLAG2_VLAN_CONTROL = 1LL << 6, | 161 | MLX4_DEV_CAP_FLAG2_VLAN_CONTROL = 1LL << 6, |
| 161 | MLX4_DEV_CAP_FLAG2_FSM = 1LL << 7, | 162 | MLX4_DEV_CAP_FLAG2_FSM = 1LL << 7, |
| @@ -640,16 +641,28 @@ struct mlx4_counter { | |||
| 640 | __be64 tx_bytes; | 641 | __be64 tx_bytes; |
| 641 | }; | 642 | }; |
| 642 | 643 | ||
| 644 | struct mlx4_quotas { | ||
| 645 | int qp; | ||
| 646 | int cq; | ||
| 647 | int srq; | ||
| 648 | int mpt; | ||
| 649 | int mtt; | ||
| 650 | int counter; | ||
| 651 | int xrcd; | ||
| 652 | }; | ||
| 653 | |||
| 643 | struct mlx4_dev { | 654 | struct mlx4_dev { |
| 644 | struct pci_dev *pdev; | 655 | struct pci_dev *pdev; |
| 645 | unsigned long flags; | 656 | unsigned long flags; |
| 646 | unsigned long num_slaves; | 657 | unsigned long num_slaves; |
| 647 | struct mlx4_caps caps; | 658 | struct mlx4_caps caps; |
| 648 | struct mlx4_phys_caps phys_caps; | 659 | struct mlx4_phys_caps phys_caps; |
| 660 | struct mlx4_quotas quotas; | ||
| 649 | struct radix_tree_root qp_table_tree; | 661 | struct radix_tree_root qp_table_tree; |
| 650 | u8 rev_id; | 662 | u8 rev_id; |
| 651 | char board_id[MLX4_BOARD_ID_LEN]; | 663 | char board_id[MLX4_BOARD_ID_LEN]; |
| 652 | int num_vfs; | 664 | int num_vfs; |
| 665 | int numa_node; | ||
| 653 | int oper_log_mgm_entry_size; | 666 | int oper_log_mgm_entry_size; |
| 654 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; | 667 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; |
| 655 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; | 668 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; |
| @@ -771,6 +784,12 @@ static inline int mlx4_is_master(struct mlx4_dev *dev) | |||
| 771 | return dev->flags & MLX4_FLAG_MASTER; | 784 | return dev->flags & MLX4_FLAG_MASTER; |
| 772 | } | 785 | } |
| 773 | 786 | ||
| 787 | static inline int mlx4_num_reserved_sqps(struct mlx4_dev *dev) | ||
| 788 | { | ||
| 789 | return dev->phys_caps.base_sqpn + 8 + | ||
| 790 | 16 * MLX4_MFUNC_MAX * !!mlx4_is_master(dev); | ||
| 791 | } | ||
| 792 | |||
| 774 | static inline int mlx4_is_qp_reserved(struct mlx4_dev *dev, u32 qpn) | 793 | static inline int mlx4_is_qp_reserved(struct mlx4_dev *dev, u32 qpn) |
| 775 | { | 794 | { |
| 776 | return (qpn < dev->phys_caps.base_sqpn + 8 + | 795 | return (qpn < dev->phys_caps.base_sqpn + 8 + |
| @@ -816,7 +835,7 @@ void mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn); | |||
| 816 | 835 | ||
| 817 | int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar); | 836 | int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar); |
| 818 | void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar); | 837 | void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar); |
| 819 | int mlx4_bf_alloc(struct mlx4_dev *dev, struct mlx4_bf *bf); | 838 | int mlx4_bf_alloc(struct mlx4_dev *dev, struct mlx4_bf *bf, int node); |
| 820 | void mlx4_bf_free(struct mlx4_dev *dev, struct mlx4_bf *bf); | 839 | void mlx4_bf_free(struct mlx4_dev *dev, struct mlx4_bf *bf); |
| 821 | 840 | ||
| 822 | int mlx4_mtt_init(struct mlx4_dev *dev, int npages, int page_shift, | 841 | int mlx4_mtt_init(struct mlx4_dev *dev, int npages, int page_shift, |
| @@ -1078,7 +1097,7 @@ int mlx4_SET_PORT_SCHEDULER(struct mlx4_dev *dev, u8 port, u8 *tc_tx_bw, | |||
| 1078 | u8 *pg, u16 *ratelimit); | 1097 | u8 *pg, u16 *ratelimit); |
| 1079 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); | 1098 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); |
| 1080 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); | 1099 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); |
| 1081 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index); | 1100 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan); |
| 1082 | 1101 | ||
| 1083 | int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list, | 1102 | int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list, |
| 1084 | int npages, u64 iova, u32 *lkey, u32 *rkey); | 1103 | int npages, u64 iova, u32 *lkey, u32 *rkey); |
diff --git a/include/linux/net.h b/include/linux/net.h index 4f27575ce1d6..b292a0435571 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */ | 24 | #include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */ |
| 25 | #include <linux/kmemcheck.h> | 25 | #include <linux/kmemcheck.h> |
| 26 | #include <linux/rcupdate.h> | 26 | #include <linux/rcupdate.h> |
| 27 | #include <linux/jump_label.h> | ||
| 27 | #include <uapi/linux/net.h> | 28 | #include <uapi/linux/net.h> |
| 28 | 29 | ||
| 29 | struct poll_table_struct; | 30 | struct poll_table_struct; |
| @@ -195,27 +196,23 @@ enum { | |||
| 195 | SOCK_WAKE_URG, | 196 | SOCK_WAKE_URG, |
| 196 | }; | 197 | }; |
| 197 | 198 | ||
| 198 | extern int sock_wake_async(struct socket *sk, int how, int band); | 199 | int sock_wake_async(struct socket *sk, int how, int band); |
| 199 | extern int sock_register(const struct net_proto_family *fam); | 200 | int sock_register(const struct net_proto_family *fam); |
| 200 | extern void sock_unregister(int family); | 201 | void sock_unregister(int family); |
| 201 | extern int __sock_create(struct net *net, int family, int type, int proto, | 202 | int __sock_create(struct net *net, int family, int type, int proto, |
| 202 | struct socket **res, int kern); | 203 | struct socket **res, int kern); |
| 203 | extern int sock_create(int family, int type, int proto, | 204 | int sock_create(int family, int type, int proto, struct socket **res); |
| 204 | struct socket **res); | 205 | int sock_create_kern(int family, int type, int proto, struct socket **res); |
| 205 | extern int sock_create_kern(int family, int type, int proto, | 206 | int sock_create_lite(int family, int type, int proto, struct socket **res); |
| 206 | struct socket **res); | 207 | void sock_release(struct socket *sock); |
| 207 | extern int sock_create_lite(int family, int type, int proto, | 208 | int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len); |
| 208 | struct socket **res); | 209 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, |
| 209 | extern void sock_release(struct socket *sock); | 210 | int flags); |
| 210 | extern int sock_sendmsg(struct socket *sock, struct msghdr *msg, | 211 | struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname); |
| 211 | size_t len); | 212 | struct socket *sockfd_lookup(int fd, int *err); |
| 212 | extern int sock_recvmsg(struct socket *sock, struct msghdr *msg, | 213 | struct socket *sock_from_file(struct file *file, int *err); |
| 213 | size_t size, int flags); | ||
| 214 | extern struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname); | ||
| 215 | extern struct socket *sockfd_lookup(int fd, int *err); | ||
| 216 | extern struct socket *sock_from_file(struct file *file, int *err); | ||
| 217 | #define sockfd_put(sock) fput(sock->file) | 214 | #define sockfd_put(sock) fput(sock->file) |
| 218 | extern int net_ratelimit(void); | 215 | int net_ratelimit(void); |
| 219 | 216 | ||
| 220 | #define net_ratelimited_function(function, ...) \ | 217 | #define net_ratelimited_function(function, ...) \ |
| 221 | do { \ | 218 | do { \ |
| @@ -243,32 +240,52 @@ do { \ | |||
| 243 | #define net_random() prandom_u32() | 240 | #define net_random() prandom_u32() |
| 244 | #define net_srandom(seed) prandom_seed((__force u32)(seed)) | 241 | #define net_srandom(seed) prandom_seed((__force u32)(seed)) |
| 245 | 242 | ||
| 246 | extern int kernel_sendmsg(struct socket *sock, struct msghdr *msg, | 243 | bool __net_get_random_once(void *buf, int nbytes, bool *done, |
| 247 | struct kvec *vec, size_t num, size_t len); | 244 | struct static_key *done_key); |
| 248 | extern int kernel_recvmsg(struct socket *sock, struct msghdr *msg, | 245 | |
| 249 | struct kvec *vec, size_t num, | 246 | #ifdef HAVE_JUMP_LABEL |
| 250 | size_t len, int flags); | 247 | #define ___NET_RANDOM_STATIC_KEY_INIT ((struct static_key) \ |
| 251 | 248 | { .enabled = ATOMIC_INIT(0), .entries = (void *)1 }) | |
| 252 | extern int kernel_bind(struct socket *sock, struct sockaddr *addr, | 249 | #else /* !HAVE_JUMP_LABEL */ |
| 253 | int addrlen); | 250 | #define ___NET_RANDOM_STATIC_KEY_INIT STATIC_KEY_INIT_FALSE |
| 254 | extern int kernel_listen(struct socket *sock, int backlog); | 251 | #endif /* HAVE_JUMP_LABEL */ |
| 255 | extern int kernel_accept(struct socket *sock, struct socket **newsock, | 252 | |
| 256 | int flags); | 253 | #define net_get_random_once(buf, nbytes) \ |
| 257 | extern int kernel_connect(struct socket *sock, struct sockaddr *addr, | 254 | ({ \ |
| 258 | int addrlen, int flags); | 255 | bool ___ret = false; \ |
| 259 | extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr, | 256 | static bool ___done = false; \ |
| 260 | int *addrlen); | 257 | static struct static_key ___done_key = \ |
| 261 | extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr, | 258 | ___NET_RANDOM_STATIC_KEY_INIT; \ |
| 262 | int *addrlen); | 259 | if (!static_key_true(&___done_key)) \ |
| 263 | extern int kernel_getsockopt(struct socket *sock, int level, int optname, | 260 | ___ret = __net_get_random_once(buf, \ |
| 264 | char *optval, int *optlen); | 261 | nbytes, \ |
| 265 | extern int kernel_setsockopt(struct socket *sock, int level, int optname, | 262 | &___done, \ |
| 266 | char *optval, unsigned int optlen); | 263 | &___done_key); \ |
| 267 | extern int kernel_sendpage(struct socket *sock, struct page *page, int offset, | 264 | ___ret; \ |
| 268 | size_t size, int flags); | 265 | }) |
| 269 | extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg); | 266 | |
| 270 | extern int kernel_sock_shutdown(struct socket *sock, | 267 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, |
| 271 | enum sock_shutdown_cmd how); | 268 | size_t num, size_t len); |
| 269 | int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, | ||
| 270 | size_t num, size_t len, int flags); | ||
| 271 | |||
| 272 | int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen); | ||
| 273 | int kernel_listen(struct socket *sock, int backlog); | ||
| 274 | int kernel_accept(struct socket *sock, struct socket **newsock, int flags); | ||
| 275 | int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, | ||
| 276 | int flags); | ||
| 277 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr, | ||
| 278 | int *addrlen); | ||
| 279 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr, | ||
| 280 | int *addrlen); | ||
| 281 | int kernel_getsockopt(struct socket *sock, int level, int optname, char *optval, | ||
| 282 | int *optlen); | ||
| 283 | int kernel_setsockopt(struct socket *sock, int level, int optname, char *optval, | ||
| 284 | unsigned int optlen); | ||
| 285 | int kernel_sendpage(struct socket *sock, struct page *page, int offset, | ||
| 286 | size_t size, int flags); | ||
| 287 | int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg); | ||
| 288 | int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how); | ||
| 272 | 289 | ||
| 273 | #define MODULE_ALIAS_NETPROTO(proto) \ | 290 | #define MODULE_ALIAS_NETPROTO(proto) \ |
| 274 | MODULE_ALIAS("net-pf-" __stringify(proto)) | 291 | MODULE_ALIAS("net-pf-" __stringify(proto)) |
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index a2a89a5c7be5..1005ebf17575 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h | |||
| @@ -42,6 +42,8 @@ enum { | |||
| 42 | NETIF_F_TSO6_BIT, /* ... TCPv6 segmentation */ | 42 | NETIF_F_TSO6_BIT, /* ... TCPv6 segmentation */ |
| 43 | NETIF_F_FSO_BIT, /* ... FCoE segmentation */ | 43 | NETIF_F_FSO_BIT, /* ... FCoE segmentation */ |
| 44 | NETIF_F_GSO_GRE_BIT, /* ... GRE with TSO */ | 44 | NETIF_F_GSO_GRE_BIT, /* ... GRE with TSO */ |
| 45 | NETIF_F_GSO_IPIP_BIT, /* ... IPIP tunnel with TSO */ | ||
| 46 | NETIF_F_GSO_SIT_BIT, /* ... SIT tunnel with TSO */ | ||
| 45 | NETIF_F_GSO_UDP_TUNNEL_BIT, /* ... UDP TUNNEL with TSO */ | 47 | NETIF_F_GSO_UDP_TUNNEL_BIT, /* ... UDP TUNNEL with TSO */ |
| 46 | NETIF_F_GSO_MPLS_BIT, /* ... MPLS segmentation */ | 48 | NETIF_F_GSO_MPLS_BIT, /* ... MPLS segmentation */ |
| 47 | /**/NETIF_F_GSO_LAST = /* last bit, see GSO_MASK */ | 49 | /**/NETIF_F_GSO_LAST = /* last bit, see GSO_MASK */ |
| @@ -60,6 +62,7 @@ enum { | |||
| 60 | NETIF_F_HW_VLAN_STAG_TX_BIT, /* Transmit VLAN STAG HW acceleration */ | 62 | NETIF_F_HW_VLAN_STAG_TX_BIT, /* Transmit VLAN STAG HW acceleration */ |
| 61 | NETIF_F_HW_VLAN_STAG_RX_BIT, /* Receive VLAN STAG HW acceleration */ | 63 | NETIF_F_HW_VLAN_STAG_RX_BIT, /* Receive VLAN STAG HW acceleration */ |
| 62 | NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */ | 64 | NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */ |
| 65 | NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */ | ||
| 63 | 66 | ||
| 64 | /* | 67 | /* |
| 65 | * Add your fresh new feature above and remember to update | 68 | * Add your fresh new feature above and remember to update |
| @@ -107,11 +110,14 @@ enum { | |||
| 107 | #define NETIF_F_RXFCS __NETIF_F(RXFCS) | 110 | #define NETIF_F_RXFCS __NETIF_F(RXFCS) |
| 108 | #define NETIF_F_RXALL __NETIF_F(RXALL) | 111 | #define NETIF_F_RXALL __NETIF_F(RXALL) |
| 109 | #define NETIF_F_GSO_GRE __NETIF_F(GSO_GRE) | 112 | #define NETIF_F_GSO_GRE __NETIF_F(GSO_GRE) |
| 113 | #define NETIF_F_GSO_IPIP __NETIF_F(GSO_IPIP) | ||
| 114 | #define NETIF_F_GSO_SIT __NETIF_F(GSO_SIT) | ||
| 110 | #define NETIF_F_GSO_UDP_TUNNEL __NETIF_F(GSO_UDP_TUNNEL) | 115 | #define NETIF_F_GSO_UDP_TUNNEL __NETIF_F(GSO_UDP_TUNNEL) |
| 111 | #define NETIF_F_GSO_MPLS __NETIF_F(GSO_MPLS) | 116 | #define NETIF_F_GSO_MPLS __NETIF_F(GSO_MPLS) |
| 112 | #define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) | 117 | #define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) |
| 113 | #define NETIF_F_HW_VLAN_STAG_RX __NETIF_F(HW_VLAN_STAG_RX) | 118 | #define NETIF_F_HW_VLAN_STAG_RX __NETIF_F(HW_VLAN_STAG_RX) |
| 114 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) | 119 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) |
| 120 | #define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD) | ||
| 115 | 121 | ||
| 116 | /* Features valid for ethtool to change */ | 122 | /* Features valid for ethtool to change */ |
| 117 | /* = all defined minus driver/device-class-related */ | 123 | /* = all defined minus driver/device-class-related */ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index adf4070586d6..8b3de7cc2ffc 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -60,8 +60,8 @@ struct wireless_dev; | |||
| 60 | #define SET_ETHTOOL_OPS(netdev,ops) \ | 60 | #define SET_ETHTOOL_OPS(netdev,ops) \ |
| 61 | ( (netdev)->ethtool_ops = (ops) ) | 61 | ( (netdev)->ethtool_ops = (ops) ) |
| 62 | 62 | ||
| 63 | extern void netdev_set_default_ethtool_ops(struct net_device *dev, | 63 | void netdev_set_default_ethtool_ops(struct net_device *dev, |
| 64 | const struct ethtool_ops *ops); | 64 | const struct ethtool_ops *ops); |
| 65 | 65 | ||
| 66 | /* hardware address assignment types */ | 66 | /* hardware address assignment types */ |
| 67 | #define NET_ADDR_PERM 0 /* address is permanent (default) */ | 67 | #define NET_ADDR_PERM 0 /* address is permanent (default) */ |
| @@ -298,7 +298,7 @@ struct netdev_boot_setup { | |||
| 298 | }; | 298 | }; |
| 299 | #define NETDEV_BOOT_SETUP_MAX 8 | 299 | #define NETDEV_BOOT_SETUP_MAX 8 |
| 300 | 300 | ||
| 301 | extern int __init netdev_boot_setup(char *str); | 301 | int __init netdev_boot_setup(char *str); |
| 302 | 302 | ||
| 303 | /* | 303 | /* |
| 304 | * Structure for NAPI scheduling similar to tasklet but with weighting | 304 | * Structure for NAPI scheduling similar to tasklet but with weighting |
| @@ -394,7 +394,7 @@ enum rx_handler_result { | |||
| 394 | typedef enum rx_handler_result rx_handler_result_t; | 394 | typedef enum rx_handler_result rx_handler_result_t; |
| 395 | typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); | 395 | typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); |
| 396 | 396 | ||
| 397 | extern void __napi_schedule(struct napi_struct *n); | 397 | void __napi_schedule(struct napi_struct *n); |
| 398 | 398 | ||
| 399 | static inline bool napi_disable_pending(struct napi_struct *n) | 399 | static inline bool napi_disable_pending(struct napi_struct *n) |
| 400 | { | 400 | { |
| @@ -445,8 +445,8 @@ static inline bool napi_reschedule(struct napi_struct *napi) | |||
| 445 | * | 445 | * |
| 446 | * Mark NAPI processing as complete. | 446 | * Mark NAPI processing as complete. |
| 447 | */ | 447 | */ |
| 448 | extern void __napi_complete(struct napi_struct *n); | 448 | void __napi_complete(struct napi_struct *n); |
| 449 | extern void napi_complete(struct napi_struct *n); | 449 | void napi_complete(struct napi_struct *n); |
| 450 | 450 | ||
| 451 | /** | 451 | /** |
| 452 | * napi_by_id - lookup a NAPI by napi_id | 452 | * napi_by_id - lookup a NAPI by napi_id |
| @@ -455,7 +455,7 @@ extern void napi_complete(struct napi_struct *n); | |||
| 455 | * lookup @napi_id in napi_hash table | 455 | * lookup @napi_id in napi_hash table |
| 456 | * must be called under rcu_read_lock() | 456 | * must be called under rcu_read_lock() |
| 457 | */ | 457 | */ |
| 458 | extern struct napi_struct *napi_by_id(unsigned int napi_id); | 458 | struct napi_struct *napi_by_id(unsigned int napi_id); |
| 459 | 459 | ||
| 460 | /** | 460 | /** |
| 461 | * napi_hash_add - add a NAPI to global hashtable | 461 | * napi_hash_add - add a NAPI to global hashtable |
| @@ -463,7 +463,7 @@ extern struct napi_struct *napi_by_id(unsigned int napi_id); | |||
| 463 | * | 463 | * |
| 464 | * generate a new napi_id and store a @napi under it in napi_hash | 464 | * generate a new napi_id and store a @napi under it in napi_hash |
| 465 | */ | 465 | */ |
| 466 | extern void napi_hash_add(struct napi_struct *napi); | 466 | void napi_hash_add(struct napi_struct *napi); |
| 467 | 467 | ||
| 468 | /** | 468 | /** |
| 469 | * napi_hash_del - remove a NAPI from global table | 469 | * napi_hash_del - remove a NAPI from global table |
| @@ -472,7 +472,7 @@ extern void napi_hash_add(struct napi_struct *napi); | |||
| 472 | * Warning: caller must observe rcu grace period | 472 | * Warning: caller must observe rcu grace period |
| 473 | * before freeing memory containing @napi | 473 | * before freeing memory containing @napi |
| 474 | */ | 474 | */ |
| 475 | extern void napi_hash_del(struct napi_struct *napi); | 475 | void napi_hash_del(struct napi_struct *napi); |
| 476 | 476 | ||
| 477 | /** | 477 | /** |
| 478 | * napi_disable - prevent NAPI from scheduling | 478 | * napi_disable - prevent NAPI from scheduling |
| @@ -483,6 +483,7 @@ extern void napi_hash_del(struct napi_struct *napi); | |||
| 483 | */ | 483 | */ |
| 484 | static inline void napi_disable(struct napi_struct *n) | 484 | static inline void napi_disable(struct napi_struct *n) |
| 485 | { | 485 | { |
| 486 | might_sleep(); | ||
| 486 | set_bit(NAPI_STATE_DISABLE, &n->state); | 487 | set_bit(NAPI_STATE_DISABLE, &n->state); |
| 487 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) | 488 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) |
| 488 | msleep(1); | 489 | msleep(1); |
| @@ -664,8 +665,8 @@ static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | |||
| 664 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; | 665 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; |
| 665 | 666 | ||
| 666 | #ifdef CONFIG_RFS_ACCEL | 667 | #ifdef CONFIG_RFS_ACCEL |
| 667 | extern bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, | 668 | bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id, |
| 668 | u32 flow_id, u16 filter_id); | 669 | u16 filter_id); |
| 669 | #endif | 670 | #endif |
| 670 | 671 | ||
| 671 | /* This structure contains an instance of an RX queue. */ | 672 | /* This structure contains an instance of an RX queue. */ |
| @@ -961,6 +962,25 @@ struct netdev_phys_port_id { | |||
| 961 | * Called by vxlan to notify the driver about a UDP port and socket | 962 | * Called by vxlan to notify the driver about a UDP port and socket |
| 962 | * address family that vxlan is not listening to anymore. The operation | 963 | * address family that vxlan is not listening to anymore. The operation |
| 963 | * is protected by the vxlan_net->sock_lock. | 964 | * is protected by the vxlan_net->sock_lock. |
| 965 | * | ||
| 966 | * void* (*ndo_dfwd_add_station)(struct net_device *pdev, | ||
| 967 | * struct net_device *dev) | ||
| 968 | * Called by upper layer devices to accelerate switching or other | ||
| 969 | * station functionality into hardware. 'pdev is the lowerdev | ||
| 970 | * to use for the offload and 'dev' is the net device that will | ||
| 971 | * back the offload. Returns a pointer to the private structure | ||
| 972 | * the upper layer will maintain. | ||
| 973 | * void (*ndo_dfwd_del_station)(struct net_device *pdev, void *priv) | ||
| 974 | * Called by upper layer device to delete the station created | ||
| 975 | * by 'ndo_dfwd_add_station'. 'pdev' is the net device backing | ||
| 976 | * the station and priv is the structure returned by the add | ||
| 977 | * operation. | ||
| 978 | * netdev_tx_t (*ndo_dfwd_start_xmit)(struct sk_buff *skb, | ||
| 979 | * struct net_device *dev, | ||
| 980 | * void *priv); | ||
| 981 | * Callback to use for xmit over the accelerated station. This | ||
| 982 | * is used in place of ndo_start_xmit on accelerated net | ||
| 983 | * devices. | ||
| 964 | */ | 984 | */ |
| 965 | struct net_device_ops { | 985 | struct net_device_ops { |
| 966 | int (*ndo_init)(struct net_device *dev); | 986 | int (*ndo_init)(struct net_device *dev); |
| @@ -1097,6 +1117,15 @@ struct net_device_ops { | |||
| 1097 | void (*ndo_del_vxlan_port)(struct net_device *dev, | 1117 | void (*ndo_del_vxlan_port)(struct net_device *dev, |
| 1098 | sa_family_t sa_family, | 1118 | sa_family_t sa_family, |
| 1099 | __be16 port); | 1119 | __be16 port); |
| 1120 | |||
| 1121 | void* (*ndo_dfwd_add_station)(struct net_device *pdev, | ||
| 1122 | struct net_device *dev); | ||
| 1123 | void (*ndo_dfwd_del_station)(struct net_device *pdev, | ||
| 1124 | void *priv); | ||
| 1125 | |||
| 1126 | netdev_tx_t (*ndo_dfwd_start_xmit) (struct sk_buff *skb, | ||
| 1127 | struct net_device *dev, | ||
| 1128 | void *priv); | ||
| 1100 | }; | 1129 | }; |
| 1101 | 1130 | ||
| 1102 | /* | 1131 | /* |
| @@ -1131,7 +1160,7 @@ struct net_device { | |||
| 1131 | unsigned long mem_end; /* shared mem end */ | 1160 | unsigned long mem_end; /* shared mem end */ |
| 1132 | unsigned long mem_start; /* shared mem start */ | 1161 | unsigned long mem_start; /* shared mem start */ |
| 1133 | unsigned long base_addr; /* device I/O address */ | 1162 | unsigned long base_addr; /* device I/O address */ |
| 1134 | unsigned int irq; /* device IRQ number */ | 1163 | int irq; /* device IRQ number */ |
| 1135 | 1164 | ||
| 1136 | /* | 1165 | /* |
| 1137 | * Some hardware also needs these fields, but they are not | 1166 | * Some hardware also needs these fields, but they are not |
| @@ -1143,8 +1172,19 @@ struct net_device { | |||
| 1143 | struct list_head dev_list; | 1172 | struct list_head dev_list; |
| 1144 | struct list_head napi_list; | 1173 | struct list_head napi_list; |
| 1145 | struct list_head unreg_list; | 1174 | struct list_head unreg_list; |
| 1146 | struct list_head upper_dev_list; /* List of upper devices */ | 1175 | struct list_head close_list; |
| 1147 | struct list_head lower_dev_list; | 1176 | |
| 1177 | /* directly linked devices, like slaves for bonding */ | ||
| 1178 | struct { | ||
| 1179 | struct list_head upper; | ||
| 1180 | struct list_head lower; | ||
| 1181 | } adj_list; | ||
| 1182 | |||
| 1183 | /* all linked devices, *including* neighbours */ | ||
| 1184 | struct { | ||
| 1185 | struct list_head upper; | ||
| 1186 | struct list_head lower; | ||
| 1187 | } all_adj_list; | ||
| 1148 | 1188 | ||
| 1149 | 1189 | ||
| 1150 | /* currently active device features */ | 1190 | /* currently active device features */ |
| @@ -1183,6 +1223,7 @@ struct net_device { | |||
| 1183 | /* Management operations */ | 1223 | /* Management operations */ |
| 1184 | const struct net_device_ops *netdev_ops; | 1224 | const struct net_device_ops *netdev_ops; |
| 1185 | const struct ethtool_ops *ethtool_ops; | 1225 | const struct ethtool_ops *ethtool_ops; |
| 1226 | const struct forwarding_accel_ops *fwd_ops; | ||
| 1186 | 1227 | ||
| 1187 | /* Hardware header description */ | 1228 | /* Hardware header description */ |
| 1188 | const struct header_ops *header_ops; | 1229 | const struct header_ops *header_ops; |
| @@ -1487,9 +1528,9 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev, | |||
| 1487 | f(dev, &dev->_tx[i], arg); | 1528 | f(dev, &dev->_tx[i], arg); |
| 1488 | } | 1529 | } |
| 1489 | 1530 | ||
| 1490 | extern struct netdev_queue *netdev_pick_tx(struct net_device *dev, | 1531 | struct netdev_queue *netdev_pick_tx(struct net_device *dev, |
| 1491 | struct sk_buff *skb); | 1532 | struct sk_buff *skb); |
| 1492 | extern u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb); | 1533 | u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb); |
| 1493 | 1534 | ||
| 1494 | /* | 1535 | /* |
| 1495 | * Net namespace inlines | 1536 | * Net namespace inlines |
| @@ -1673,8 +1714,8 @@ struct packet_offload { | |||
| 1673 | #define NETDEV_CHANGEUPPER 0x0015 | 1714 | #define NETDEV_CHANGEUPPER 0x0015 |
| 1674 | #define NETDEV_RESEND_IGMP 0x0016 | 1715 | #define NETDEV_RESEND_IGMP 0x0016 |
| 1675 | 1716 | ||
| 1676 | extern int register_netdevice_notifier(struct notifier_block *nb); | 1717 | int register_netdevice_notifier(struct notifier_block *nb); |
| 1677 | extern int unregister_netdevice_notifier(struct notifier_block *nb); | 1718 | int unregister_netdevice_notifier(struct notifier_block *nb); |
| 1678 | 1719 | ||
| 1679 | struct netdev_notifier_info { | 1720 | struct netdev_notifier_info { |
| 1680 | struct net_device *dev; | 1721 | struct net_device *dev; |
| @@ -1697,9 +1738,9 @@ netdev_notifier_info_to_dev(const struct netdev_notifier_info *info) | |||
| 1697 | return info->dev; | 1738 | return info->dev; |
| 1698 | } | 1739 | } |
| 1699 | 1740 | ||
| 1700 | extern int call_netdevice_notifiers_info(unsigned long val, struct net_device *dev, | 1741 | int call_netdevice_notifiers_info(unsigned long val, struct net_device *dev, |
| 1701 | struct netdev_notifier_info *info); | 1742 | struct netdev_notifier_info *info); |
| 1702 | extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev); | 1743 | int call_netdevice_notifiers(unsigned long val, struct net_device *dev); |
| 1703 | 1744 | ||
| 1704 | 1745 | ||
| 1705 | extern rwlock_t dev_base_lock; /* Device list lock */ | 1746 | extern rwlock_t dev_base_lock; /* Device list lock */ |
| @@ -1754,54 +1795,53 @@ static inline struct net_device *first_net_device_rcu(struct net *net) | |||
| 1754 | return lh == &net->dev_base_head ? NULL : net_device_entry(lh); | 1795 | return lh == &net->dev_base_head ? NULL : net_device_entry(lh); |
| 1755 | } | 1796 | } |
| 1756 | 1797 | ||
| 1757 | extern int netdev_boot_setup_check(struct net_device *dev); | 1798 | int netdev_boot_setup_check(struct net_device *dev); |
| 1758 | extern unsigned long netdev_boot_base(const char *prefix, int unit); | 1799 | unsigned long netdev_boot_base(const char *prefix, int unit); |
| 1759 | extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, | 1800 | struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, |
| 1760 | const char *hwaddr); | 1801 | const char *hwaddr); |
| 1761 | extern struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type); | 1802 | struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type); |
| 1762 | extern struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type); | 1803 | struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type); |
| 1763 | extern void dev_add_pack(struct packet_type *pt); | 1804 | void dev_add_pack(struct packet_type *pt); |
| 1764 | extern void dev_remove_pack(struct packet_type *pt); | 1805 | void dev_remove_pack(struct packet_type *pt); |
| 1765 | extern void __dev_remove_pack(struct packet_type *pt); | 1806 | void __dev_remove_pack(struct packet_type *pt); |
| 1766 | extern void dev_add_offload(struct packet_offload *po); | 1807 | void dev_add_offload(struct packet_offload *po); |
| 1767 | extern void dev_remove_offload(struct packet_offload *po); | 1808 | void dev_remove_offload(struct packet_offload *po); |
| 1768 | extern void __dev_remove_offload(struct packet_offload *po); | 1809 | void __dev_remove_offload(struct packet_offload *po); |
| 1769 | 1810 | ||
| 1770 | extern struct net_device *dev_get_by_flags_rcu(struct net *net, unsigned short flags, | 1811 | struct net_device *dev_get_by_flags_rcu(struct net *net, unsigned short flags, |
| 1771 | unsigned short mask); | 1812 | unsigned short mask); |
| 1772 | extern struct net_device *dev_get_by_name(struct net *net, const char *name); | 1813 | struct net_device *dev_get_by_name(struct net *net, const char *name); |
| 1773 | extern struct net_device *dev_get_by_name_rcu(struct net *net, const char *name); | 1814 | struct net_device *dev_get_by_name_rcu(struct net *net, const char *name); |
| 1774 | extern struct net_device *__dev_get_by_name(struct net *net, const char *name); | 1815 | struct net_device *__dev_get_by_name(struct net *net, const char *name); |
| 1775 | extern int dev_alloc_name(struct net_device *dev, const char *name); | 1816 | int dev_alloc_name(struct net_device *dev, const char *name); |
| 1776 | extern int dev_open(struct net_device *dev); | 1817 | int dev_open(struct net_device *dev); |
| 1777 | extern int dev_close(struct net_device *dev); | 1818 | int dev_close(struct net_device *dev); |
| 1778 | extern void dev_disable_lro(struct net_device *dev); | 1819 | void dev_disable_lro(struct net_device *dev); |
| 1779 | extern int dev_loopback_xmit(struct sk_buff *newskb); | 1820 | int dev_loopback_xmit(struct sk_buff *newskb); |
| 1780 | extern int dev_queue_xmit(struct sk_buff *skb); | 1821 | int dev_queue_xmit(struct sk_buff *skb); |
| 1781 | extern int register_netdevice(struct net_device *dev); | 1822 | int register_netdevice(struct net_device *dev); |
| 1782 | extern void unregister_netdevice_queue(struct net_device *dev, | 1823 | void unregister_netdevice_queue(struct net_device *dev, struct list_head *head); |
| 1783 | struct list_head *head); | 1824 | void unregister_netdevice_many(struct list_head *head); |
| 1784 | extern void unregister_netdevice_many(struct list_head *head); | ||
| 1785 | static inline void unregister_netdevice(struct net_device *dev) | 1825 | static inline void unregister_netdevice(struct net_device *dev) |
| 1786 | { | 1826 | { |
| 1787 | unregister_netdevice_queue(dev, NULL); | 1827 | unregister_netdevice_queue(dev, NULL); |
| 1788 | } | 1828 | } |
| 1789 | 1829 | ||
| 1790 | extern int netdev_refcnt_read(const struct net_device *dev); | 1830 | int netdev_refcnt_read(const struct net_device *dev); |
| 1791 | extern void free_netdev(struct net_device *dev); | 1831 | void free_netdev(struct net_device *dev); |
| 1792 | extern void synchronize_net(void); | 1832 | void netdev_freemem(struct net_device *dev); |
| 1793 | extern int init_dummy_netdev(struct net_device *dev); | 1833 | void synchronize_net(void); |
| 1834 | int init_dummy_netdev(struct net_device *dev); | ||
| 1794 | 1835 | ||
| 1795 | extern struct net_device *dev_get_by_index(struct net *net, int ifindex); | 1836 | struct net_device *dev_get_by_index(struct net *net, int ifindex); |
| 1796 | extern struct net_device *__dev_get_by_index(struct net *net, int ifindex); | 1837 | struct net_device *__dev_get_by_index(struct net *net, int ifindex); |
| 1797 | extern struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); | 1838 | struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); |
| 1798 | extern int netdev_get_name(struct net *net, char *name, int ifindex); | 1839 | int netdev_get_name(struct net *net, char *name, int ifindex); |
| 1799 | extern int dev_restart(struct net_device *dev); | 1840 | int dev_restart(struct net_device *dev); |
| 1800 | #ifdef CONFIG_NETPOLL_TRAP | 1841 | #ifdef CONFIG_NETPOLL_TRAP |
| 1801 | extern int netpoll_trap(void); | 1842 | int netpoll_trap(void); |
| 1802 | #endif | 1843 | #endif |
| 1803 | extern int skb_gro_receive(struct sk_buff **head, | 1844 | int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb); |
| 1804 | struct sk_buff *skb); | ||
| 1805 | 1845 | ||
| 1806 | static inline unsigned int skb_gro_offset(const struct sk_buff *skb) | 1846 | static inline unsigned int skb_gro_offset(const struct sk_buff *skb) |
| 1807 | { | 1847 | { |
| @@ -1873,7 +1913,7 @@ static inline int dev_parse_header(const struct sk_buff *skb, | |||
| 1873 | } | 1913 | } |
| 1874 | 1914 | ||
| 1875 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); | 1915 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); |
| 1876 | extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf); | 1916 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); |
| 1877 | static inline int unregister_gifconf(unsigned int family) | 1917 | static inline int unregister_gifconf(unsigned int family) |
| 1878 | { | 1918 | { |
| 1879 | return register_gifconf(family, NULL); | 1919 | return register_gifconf(family, NULL); |
| @@ -1944,7 +1984,7 @@ static inline void input_queue_tail_incr_save(struct softnet_data *sd, | |||
| 1944 | 1984 | ||
| 1945 | DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data); | 1985 | DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data); |
| 1946 | 1986 | ||
| 1947 | extern void __netif_schedule(struct Qdisc *q); | 1987 | void __netif_schedule(struct Qdisc *q); |
| 1948 | 1988 | ||
| 1949 | static inline void netif_schedule_queue(struct netdev_queue *txq) | 1989 | static inline void netif_schedule_queue(struct netdev_queue *txq) |
| 1950 | { | 1990 | { |
| @@ -2264,9 +2304,8 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index) | |||
| 2264 | } | 2304 | } |
| 2265 | 2305 | ||
| 2266 | #ifdef CONFIG_XPS | 2306 | #ifdef CONFIG_XPS |
| 2267 | extern int netif_set_xps_queue(struct net_device *dev, | 2307 | int netif_set_xps_queue(struct net_device *dev, const struct cpumask *mask, |
| 2268 | const struct cpumask *mask, | 2308 | u16 index); |
| 2269 | u16 index); | ||
| 2270 | #else | 2309 | #else |
| 2271 | static inline int netif_set_xps_queue(struct net_device *dev, | 2310 | static inline int netif_set_xps_queue(struct net_device *dev, |
| 2272 | const struct cpumask *mask, | 2311 | const struct cpumask *mask, |
| @@ -2297,12 +2336,10 @@ static inline bool netif_is_multiqueue(const struct net_device *dev) | |||
| 2297 | return dev->num_tx_queues > 1; | 2336 | return dev->num_tx_queues > 1; |
| 2298 | } | 2337 | } |
| 2299 | 2338 | ||
| 2300 | extern int netif_set_real_num_tx_queues(struct net_device *dev, | 2339 | int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq); |
| 2301 | unsigned int txq); | ||
| 2302 | 2340 | ||
| 2303 | #ifdef CONFIG_RPS | 2341 | #ifdef CONFIG_RPS |
| 2304 | extern int netif_set_real_num_rx_queues(struct net_device *dev, | 2342 | int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq); |
| 2305 | unsigned int rxq); | ||
| 2306 | #else | 2343 | #else |
| 2307 | static inline int netif_set_real_num_rx_queues(struct net_device *dev, | 2344 | static inline int netif_set_real_num_rx_queues(struct net_device *dev, |
| 2308 | unsigned int rxq) | 2345 | unsigned int rxq) |
| @@ -2329,28 +2366,27 @@ static inline int netif_copy_real_num_queues(struct net_device *to_dev, | |||
| 2329 | } | 2366 | } |
| 2330 | 2367 | ||
| 2331 | #define DEFAULT_MAX_NUM_RSS_QUEUES (8) | 2368 | #define DEFAULT_MAX_NUM_RSS_QUEUES (8) |
| 2332 | extern int netif_get_num_default_rss_queues(void); | 2369 | int netif_get_num_default_rss_queues(void); |
| 2333 | 2370 | ||
| 2334 | /* Use this variant when it is known for sure that it | 2371 | /* Use this variant when it is known for sure that it |
| 2335 | * is executing from hardware interrupt context or with hardware interrupts | 2372 | * is executing from hardware interrupt context or with hardware interrupts |
| 2336 | * disabled. | 2373 | * disabled. |
| 2337 | */ | 2374 | */ |
| 2338 | extern void dev_kfree_skb_irq(struct sk_buff *skb); | 2375 | void dev_kfree_skb_irq(struct sk_buff *skb); |
| 2339 | 2376 | ||
| 2340 | /* Use this variant in places where it could be invoked | 2377 | /* Use this variant in places where it could be invoked |
| 2341 | * from either hardware interrupt or other context, with hardware interrupts | 2378 | * from either hardware interrupt or other context, with hardware interrupts |
| 2342 | * either disabled or enabled. | 2379 | * either disabled or enabled. |
| 2343 | */ | 2380 | */ |
| 2344 | extern void dev_kfree_skb_any(struct sk_buff *skb); | 2381 | void dev_kfree_skb_any(struct sk_buff *skb); |
| 2345 | 2382 | ||
| 2346 | extern int netif_rx(struct sk_buff *skb); | 2383 | int netif_rx(struct sk_buff *skb); |
| 2347 | extern int netif_rx_ni(struct sk_buff *skb); | 2384 | int netif_rx_ni(struct sk_buff *skb); |
| 2348 | extern int netif_receive_skb(struct sk_buff *skb); | 2385 | int netif_receive_skb(struct sk_buff *skb); |
| 2349 | extern gro_result_t napi_gro_receive(struct napi_struct *napi, | 2386 | gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb); |
| 2350 | struct sk_buff *skb); | 2387 | void napi_gro_flush(struct napi_struct *napi, bool flush_old); |
| 2351 | extern void napi_gro_flush(struct napi_struct *napi, bool flush_old); | 2388 | struct sk_buff *napi_get_frags(struct napi_struct *napi); |
| 2352 | extern struct sk_buff * napi_get_frags(struct napi_struct *napi); | 2389 | gro_result_t napi_gro_frags(struct napi_struct *napi); |
| 2353 | extern gro_result_t napi_gro_frags(struct napi_struct *napi); | ||
| 2354 | 2390 | ||
| 2355 | static inline void napi_free_frags(struct napi_struct *napi) | 2391 | static inline void napi_free_frags(struct napi_struct *napi) |
| 2356 | { | 2392 | { |
| @@ -2358,40 +2394,36 @@ static inline void napi_free_frags(struct napi_struct *napi) | |||
| 2358 | napi->skb = NULL; | 2394 | napi->skb = NULL; |
| 2359 | } | 2395 | } |
| 2360 | 2396 | ||
| 2361 | extern int netdev_rx_handler_register(struct net_device *dev, | 2397 | int netdev_rx_handler_register(struct net_device *dev, |
| 2362 | rx_handler_func_t *rx_handler, | 2398 | rx_handler_func_t *rx_handler, |
| 2363 | void *rx_handler_data); | 2399 | void *rx_handler_data); |
| 2364 | extern void netdev_rx_handler_unregister(struct net_device *dev); | 2400 | void netdev_rx_handler_unregister(struct net_device *dev); |
| 2365 | 2401 | ||
| 2366 | extern bool dev_valid_name(const char *name); | 2402 | bool dev_valid_name(const char *name); |
| 2367 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); | 2403 | int dev_ioctl(struct net *net, unsigned int cmd, void __user *); |
| 2368 | extern int dev_ethtool(struct net *net, struct ifreq *); | 2404 | int dev_ethtool(struct net *net, struct ifreq *); |
| 2369 | extern unsigned int dev_get_flags(const struct net_device *); | 2405 | unsigned int dev_get_flags(const struct net_device *); |
| 2370 | extern int __dev_change_flags(struct net_device *, unsigned int flags); | 2406 | int __dev_change_flags(struct net_device *, unsigned int flags); |
| 2371 | extern int dev_change_flags(struct net_device *, unsigned int); | 2407 | int dev_change_flags(struct net_device *, unsigned int); |
| 2372 | extern void __dev_notify_flags(struct net_device *, unsigned int old_flags); | 2408 | void __dev_notify_flags(struct net_device *, unsigned int old_flags, |
| 2373 | extern int dev_change_name(struct net_device *, const char *); | 2409 | unsigned int gchanges); |
| 2374 | extern int dev_set_alias(struct net_device *, const char *, size_t); | 2410 | int dev_change_name(struct net_device *, const char *); |
| 2375 | extern int dev_change_net_namespace(struct net_device *, | 2411 | int dev_set_alias(struct net_device *, const char *, size_t); |
| 2376 | struct net *, const char *); | 2412 | int dev_change_net_namespace(struct net_device *, struct net *, const char *); |
| 2377 | extern int dev_set_mtu(struct net_device *, int); | 2413 | int dev_set_mtu(struct net_device *, int); |
| 2378 | extern void dev_set_group(struct net_device *, int); | 2414 | void dev_set_group(struct net_device *, int); |
| 2379 | extern int dev_set_mac_address(struct net_device *, | 2415 | int dev_set_mac_address(struct net_device *, struct sockaddr *); |
| 2380 | struct sockaddr *); | 2416 | int dev_change_carrier(struct net_device *, bool new_carrier); |
| 2381 | extern int dev_change_carrier(struct net_device *, | 2417 | int dev_get_phys_port_id(struct net_device *dev, |
| 2382 | bool new_carrier); | 2418 | struct netdev_phys_port_id *ppid); |
| 2383 | extern int dev_get_phys_port_id(struct net_device *dev, | 2419 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, |
| 2384 | struct netdev_phys_port_id *ppid); | 2420 | struct netdev_queue *txq, void *accel_priv); |
| 2385 | extern int dev_hard_start_xmit(struct sk_buff *skb, | 2421 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb); |
| 2386 | struct net_device *dev, | ||
| 2387 | struct netdev_queue *txq); | ||
| 2388 | extern int dev_forward_skb(struct net_device *dev, | ||
| 2389 | struct sk_buff *skb); | ||
| 2390 | 2422 | ||
| 2391 | extern int netdev_budget; | 2423 | extern int netdev_budget; |
| 2392 | 2424 | ||
| 2393 | /* Called by rtnetlink.c:rtnl_unlock() */ | 2425 | /* Called by rtnetlink.c:rtnl_unlock() */ |
| 2394 | extern void netdev_run_todo(void); | 2426 | void netdev_run_todo(void); |
| 2395 | 2427 | ||
| 2396 | /** | 2428 | /** |
| 2397 | * dev_put - release reference to device | 2429 | * dev_put - release reference to device |
| @@ -2424,9 +2456,9 @@ static inline void dev_hold(struct net_device *dev) | |||
| 2424 | * kind of lower layer not just hardware media. | 2456 | * kind of lower layer not just hardware media. |
| 2425 | */ | 2457 | */ |
| 2426 | 2458 | ||
| 2427 | extern void linkwatch_init_dev(struct net_device *dev); | 2459 | void linkwatch_init_dev(struct net_device *dev); |
| 2428 | extern void linkwatch_fire_event(struct net_device *dev); | 2460 | void linkwatch_fire_event(struct net_device *dev); |
| 2429 | extern void linkwatch_forget_dev(struct net_device *dev); | 2461 | void linkwatch_forget_dev(struct net_device *dev); |
| 2430 | 2462 | ||
| 2431 | /** | 2463 | /** |
| 2432 | * netif_carrier_ok - test if carrier present | 2464 | * netif_carrier_ok - test if carrier present |
| @@ -2439,13 +2471,13 @@ static inline bool netif_carrier_ok(const struct net_device *dev) | |||
| 2439 | return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); | 2471 | return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); |
| 2440 | } | 2472 | } |
| 2441 | 2473 | ||
| 2442 | extern unsigned long dev_trans_start(struct net_device *dev); | 2474 | unsigned long dev_trans_start(struct net_device *dev); |
| 2443 | 2475 | ||
| 2444 | extern void __netdev_watchdog_up(struct net_device *dev); | 2476 | void __netdev_watchdog_up(struct net_device *dev); |
| 2445 | 2477 | ||
| 2446 | extern void netif_carrier_on(struct net_device *dev); | 2478 | void netif_carrier_on(struct net_device *dev); |
| 2447 | 2479 | ||
| 2448 | extern void netif_carrier_off(struct net_device *dev); | 2480 | void netif_carrier_off(struct net_device *dev); |
| 2449 | 2481 | ||
| 2450 | /** | 2482 | /** |
| 2451 | * netif_dormant_on - mark device as dormant. | 2483 | * netif_dormant_on - mark device as dormant. |
| @@ -2513,9 +2545,9 @@ static inline bool netif_device_present(struct net_device *dev) | |||
| 2513 | return test_bit(__LINK_STATE_PRESENT, &dev->state); | 2545 | return test_bit(__LINK_STATE_PRESENT, &dev->state); |
| 2514 | } | 2546 | } |
| 2515 | 2547 | ||
| 2516 | extern void netif_device_detach(struct net_device *dev); | 2548 | void netif_device_detach(struct net_device *dev); |
| 2517 | 2549 | ||
| 2518 | extern void netif_device_attach(struct net_device *dev); | 2550 | void netif_device_attach(struct net_device *dev); |
| 2519 | 2551 | ||
| 2520 | /* | 2552 | /* |
| 2521 | * Network interface message level settings | 2553 | * Network interface message level settings |
| @@ -2724,119 +2756,138 @@ static inline void netif_addr_unlock_bh(struct net_device *dev) | |||
| 2724 | 2756 | ||
| 2725 | /* These functions live elsewhere (drivers/net/net_init.c, but related) */ | 2757 | /* These functions live elsewhere (drivers/net/net_init.c, but related) */ |
| 2726 | 2758 | ||
| 2727 | extern void ether_setup(struct net_device *dev); | 2759 | void ether_setup(struct net_device *dev); |
| 2728 | 2760 | ||
| 2729 | /* Support for loadable net-drivers */ | 2761 | /* Support for loadable net-drivers */ |
| 2730 | extern struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, | 2762 | struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, |
| 2731 | void (*setup)(struct net_device *), | 2763 | void (*setup)(struct net_device *), |
| 2732 | unsigned int txqs, unsigned int rxqs); | 2764 | unsigned int txqs, unsigned int rxqs); |
| 2733 | #define alloc_netdev(sizeof_priv, name, setup) \ | 2765 | #define alloc_netdev(sizeof_priv, name, setup) \ |
| 2734 | alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1) | 2766 | alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1) |
| 2735 | 2767 | ||
| 2736 | #define alloc_netdev_mq(sizeof_priv, name, setup, count) \ | 2768 | #define alloc_netdev_mq(sizeof_priv, name, setup, count) \ |
| 2737 | alloc_netdev_mqs(sizeof_priv, name, setup, count, count) | 2769 | alloc_netdev_mqs(sizeof_priv, name, setup, count, count) |
| 2738 | 2770 | ||
| 2739 | extern int register_netdev(struct net_device *dev); | 2771 | int register_netdev(struct net_device *dev); |
| 2740 | extern void unregister_netdev(struct net_device *dev); | 2772 | void unregister_netdev(struct net_device *dev); |
| 2741 | 2773 | ||
| 2742 | /* General hardware address lists handling functions */ | 2774 | /* General hardware address lists handling functions */ |
| 2743 | extern int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, | 2775 | int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, |
| 2744 | struct netdev_hw_addr_list *from_list, | 2776 | struct netdev_hw_addr_list *from_list, |
| 2745 | int addr_len, unsigned char addr_type); | 2777 | int addr_len, unsigned char addr_type); |
| 2746 | extern void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, | 2778 | void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, |
| 2747 | struct netdev_hw_addr_list *from_list, | 2779 | struct netdev_hw_addr_list *from_list, |
| 2748 | int addr_len, unsigned char addr_type); | 2780 | int addr_len, unsigned char addr_type); |
| 2749 | extern int __hw_addr_sync(struct netdev_hw_addr_list *to_list, | 2781 | int __hw_addr_sync(struct netdev_hw_addr_list *to_list, |
| 2750 | struct netdev_hw_addr_list *from_list, | 2782 | struct netdev_hw_addr_list *from_list, int addr_len); |
| 2751 | int addr_len); | 2783 | void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, |
| 2752 | extern void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, | 2784 | struct netdev_hw_addr_list *from_list, int addr_len); |
| 2753 | struct netdev_hw_addr_list *from_list, | 2785 | void __hw_addr_flush(struct netdev_hw_addr_list *list); |
| 2754 | int addr_len); | 2786 | void __hw_addr_init(struct netdev_hw_addr_list *list); |
| 2755 | extern void __hw_addr_flush(struct netdev_hw_addr_list *list); | ||
| 2756 | extern void __hw_addr_init(struct netdev_hw_addr_list *list); | ||
| 2757 | 2787 | ||
| 2758 | /* Functions used for device addresses handling */ | 2788 | /* Functions used for device addresses handling */ |
| 2759 | extern int dev_addr_add(struct net_device *dev, const unsigned char *addr, | 2789 | int dev_addr_add(struct net_device *dev, const unsigned char *addr, |
| 2760 | unsigned char addr_type); | 2790 | unsigned char addr_type); |
| 2761 | extern int dev_addr_del(struct net_device *dev, const unsigned char *addr, | 2791 | int dev_addr_del(struct net_device *dev, const unsigned char *addr, |
| 2762 | unsigned char addr_type); | 2792 | unsigned char addr_type); |
| 2763 | extern int dev_addr_add_multiple(struct net_device *to_dev, | 2793 | int dev_addr_add_multiple(struct net_device *to_dev, |
| 2764 | struct net_device *from_dev, | 2794 | struct net_device *from_dev, unsigned char addr_type); |
| 2765 | unsigned char addr_type); | 2795 | int dev_addr_del_multiple(struct net_device *to_dev, |
| 2766 | extern int dev_addr_del_multiple(struct net_device *to_dev, | 2796 | struct net_device *from_dev, unsigned char addr_type); |
| 2767 | struct net_device *from_dev, | 2797 | void dev_addr_flush(struct net_device *dev); |
| 2768 | unsigned char addr_type); | 2798 | int dev_addr_init(struct net_device *dev); |
| 2769 | extern void dev_addr_flush(struct net_device *dev); | ||
| 2770 | extern int dev_addr_init(struct net_device *dev); | ||
| 2771 | 2799 | ||
| 2772 | /* Functions used for unicast addresses handling */ | 2800 | /* Functions used for unicast addresses handling */ |
| 2773 | extern int dev_uc_add(struct net_device *dev, const unsigned char *addr); | 2801 | int dev_uc_add(struct net_device *dev, const unsigned char *addr); |
| 2774 | extern int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr); | 2802 | int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr); |
| 2775 | extern int dev_uc_del(struct net_device *dev, const unsigned char *addr); | 2803 | int dev_uc_del(struct net_device *dev, const unsigned char *addr); |
| 2776 | extern int dev_uc_sync(struct net_device *to, struct net_device *from); | 2804 | int dev_uc_sync(struct net_device *to, struct net_device *from); |
| 2777 | extern int dev_uc_sync_multiple(struct net_device *to, struct net_device *from); | 2805 | int dev_uc_sync_multiple(struct net_device *to, struct net_device *from); |
| 2778 | extern void dev_uc_unsync(struct net_device *to, struct net_device *from); | 2806 | void dev_uc_unsync(struct net_device *to, struct net_device *from); |
| 2779 | extern void dev_uc_flush(struct net_device *dev); | 2807 | void dev_uc_flush(struct net_device *dev); |
| 2780 | extern void dev_uc_init(struct net_device *dev); | 2808 | void dev_uc_init(struct net_device *dev); |
| 2781 | 2809 | ||
| 2782 | /* Functions used for multicast addresses handling */ | 2810 | /* Functions used for multicast addresses handling */ |
| 2783 | extern int dev_mc_add(struct net_device *dev, const unsigned char *addr); | 2811 | int dev_mc_add(struct net_device *dev, const unsigned char *addr); |
| 2784 | extern int dev_mc_add_global(struct net_device *dev, const unsigned char *addr); | 2812 | int dev_mc_add_global(struct net_device *dev, const unsigned char *addr); |
| 2785 | extern int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr); | 2813 | int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr); |
| 2786 | extern int dev_mc_del(struct net_device *dev, const unsigned char *addr); | 2814 | int dev_mc_del(struct net_device *dev, const unsigned char *addr); |
| 2787 | extern int dev_mc_del_global(struct net_device *dev, const unsigned char *addr); | 2815 | int dev_mc_del_global(struct net_device *dev, const unsigned char *addr); |
| 2788 | extern int dev_mc_sync(struct net_device *to, struct net_device *from); | 2816 | int dev_mc_sync(struct net_device *to, struct net_device *from); |
| 2789 | extern int dev_mc_sync_multiple(struct net_device *to, struct net_device *from); | 2817 | int dev_mc_sync_multiple(struct net_device *to, struct net_device *from); |
| 2790 | extern void dev_mc_unsync(struct net_device *to, struct net_device *from); | 2818 | void dev_mc_unsync(struct net_device *to, struct net_device *from); |
| 2791 | extern void dev_mc_flush(struct net_device *dev); | 2819 | void dev_mc_flush(struct net_device *dev); |
| 2792 | extern void dev_mc_init(struct net_device *dev); | 2820 | void dev_mc_init(struct net_device *dev); |
| 2793 | 2821 | ||
| 2794 | /* Functions used for secondary unicast and multicast support */ | 2822 | /* Functions used for secondary unicast and multicast support */ |
| 2795 | extern void dev_set_rx_mode(struct net_device *dev); | 2823 | void dev_set_rx_mode(struct net_device *dev); |
| 2796 | extern void __dev_set_rx_mode(struct net_device *dev); | 2824 | void __dev_set_rx_mode(struct net_device *dev); |
| 2797 | extern int dev_set_promiscuity(struct net_device *dev, int inc); | 2825 | int dev_set_promiscuity(struct net_device *dev, int inc); |
| 2798 | extern int dev_set_allmulti(struct net_device *dev, int inc); | 2826 | int dev_set_allmulti(struct net_device *dev, int inc); |
| 2799 | extern void netdev_state_change(struct net_device *dev); | 2827 | void netdev_state_change(struct net_device *dev); |
| 2800 | extern void netdev_notify_peers(struct net_device *dev); | 2828 | void netdev_notify_peers(struct net_device *dev); |
| 2801 | extern void netdev_features_change(struct net_device *dev); | 2829 | void netdev_features_change(struct net_device *dev); |
| 2802 | /* Load a device via the kmod */ | 2830 | /* Load a device via the kmod */ |
| 2803 | extern void dev_load(struct net *net, const char *name); | 2831 | void dev_load(struct net *net, const char *name); |
| 2804 | extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, | 2832 | struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, |
| 2805 | struct rtnl_link_stats64 *storage); | 2833 | struct rtnl_link_stats64 *storage); |
| 2806 | extern void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64, | 2834 | void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64, |
| 2807 | const struct net_device_stats *netdev_stats); | 2835 | const struct net_device_stats *netdev_stats); |
| 2808 | 2836 | ||
| 2809 | extern int netdev_max_backlog; | 2837 | extern int netdev_max_backlog; |
| 2810 | extern int netdev_tstamp_prequeue; | 2838 | extern int netdev_tstamp_prequeue; |
| 2811 | extern int weight_p; | 2839 | extern int weight_p; |
| 2812 | extern int bpf_jit_enable; | 2840 | extern int bpf_jit_enable; |
| 2813 | 2841 | ||
| 2814 | extern bool netdev_has_upper_dev(struct net_device *dev, | 2842 | bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev); |
| 2815 | struct net_device *upper_dev); | 2843 | bool netdev_has_any_upper_dev(struct net_device *dev); |
| 2816 | extern bool netdev_has_any_upper_dev(struct net_device *dev); | 2844 | struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev, |
| 2817 | extern struct net_device *netdev_upper_get_next_dev_rcu(struct net_device *dev, | 2845 | struct list_head **iter); |
| 2818 | struct list_head **iter); | ||
| 2819 | 2846 | ||
| 2820 | /* iterate through upper list, must be called under RCU read lock */ | 2847 | /* iterate through upper list, must be called under RCU read lock */ |
| 2821 | #define netdev_for_each_upper_dev_rcu(dev, upper, iter) \ | 2848 | #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \ |
| 2822 | for (iter = &(dev)->upper_dev_list, \ | 2849 | for (iter = &(dev)->all_adj_list.upper, \ |
| 2823 | upper = netdev_upper_get_next_dev_rcu(dev, &(iter)); \ | 2850 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \ |
| 2824 | upper; \ | 2851 | updev; \ |
| 2825 | upper = netdev_upper_get_next_dev_rcu(dev, &(iter))) | 2852 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter))) |
| 2826 | 2853 | ||
| 2827 | extern struct net_device *netdev_master_upper_dev_get(struct net_device *dev); | 2854 | void *netdev_lower_get_next_private(struct net_device *dev, |
| 2828 | extern struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); | 2855 | struct list_head **iter); |
| 2829 | extern int netdev_upper_dev_link(struct net_device *dev, | 2856 | void *netdev_lower_get_next_private_rcu(struct net_device *dev, |
| 2857 | struct list_head **iter); | ||
| 2858 | |||
| 2859 | #define netdev_for_each_lower_private(dev, priv, iter) \ | ||
| 2860 | for (iter = (dev)->adj_list.lower.next, \ | ||
| 2861 | priv = netdev_lower_get_next_private(dev, &(iter)); \ | ||
| 2862 | priv; \ | ||
| 2863 | priv = netdev_lower_get_next_private(dev, &(iter))) | ||
| 2864 | |||
| 2865 | #define netdev_for_each_lower_private_rcu(dev, priv, iter) \ | ||
| 2866 | for (iter = &(dev)->adj_list.lower, \ | ||
| 2867 | priv = netdev_lower_get_next_private_rcu(dev, &(iter)); \ | ||
| 2868 | priv; \ | ||
| 2869 | priv = netdev_lower_get_next_private_rcu(dev, &(iter))) | ||
| 2870 | |||
| 2871 | void *netdev_adjacent_get_private(struct list_head *adj_list); | ||
| 2872 | struct net_device *netdev_master_upper_dev_get(struct net_device *dev); | ||
| 2873 | struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); | ||
| 2874 | int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev); | ||
| 2875 | int netdev_master_upper_dev_link(struct net_device *dev, | ||
| 2830 | struct net_device *upper_dev); | 2876 | struct net_device *upper_dev); |
| 2831 | extern int netdev_master_upper_dev_link(struct net_device *dev, | 2877 | int netdev_master_upper_dev_link_private(struct net_device *dev, |
| 2832 | struct net_device *upper_dev); | 2878 | struct net_device *upper_dev, |
| 2833 | extern void netdev_upper_dev_unlink(struct net_device *dev, | 2879 | void *private); |
| 2834 | struct net_device *upper_dev); | 2880 | void netdev_upper_dev_unlink(struct net_device *dev, |
| 2835 | extern int skb_checksum_help(struct sk_buff *skb); | 2881 | struct net_device *upper_dev); |
| 2836 | extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb, | 2882 | void *netdev_lower_dev_get_private_rcu(struct net_device *dev, |
| 2837 | netdev_features_t features, bool tx_path); | 2883 | struct net_device *lower_dev); |
| 2838 | extern struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, | 2884 | void *netdev_lower_dev_get_private(struct net_device *dev, |
| 2839 | netdev_features_t features); | 2885 | struct net_device *lower_dev); |
| 2886 | int skb_checksum_help(struct sk_buff *skb); | ||
| 2887 | struct sk_buff *__skb_gso_segment(struct sk_buff *skb, | ||
| 2888 | netdev_features_t features, bool tx_path); | ||
| 2889 | struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, | ||
| 2890 | netdev_features_t features); | ||
| 2840 | 2891 | ||
| 2841 | static inline | 2892 | static inline |
| 2842 | struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) | 2893 | struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) |
| @@ -2858,26 +2909,26 @@ static inline bool can_checksum_protocol(netdev_features_t features, | |||
| 2858 | } | 2909 | } |
| 2859 | 2910 | ||
| 2860 | #ifdef CONFIG_BUG | 2911 | #ifdef CONFIG_BUG |
| 2861 | extern void netdev_rx_csum_fault(struct net_device *dev); | 2912 | void netdev_rx_csum_fault(struct net_device *dev); |
| 2862 | #else | 2913 | #else |
| 2863 | static inline void netdev_rx_csum_fault(struct net_device *dev) | 2914 | static inline void netdev_rx_csum_fault(struct net_device *dev) |
| 2864 | { | 2915 | { |
| 2865 | } | 2916 | } |
| 2866 | #endif | 2917 | #endif |
| 2867 | /* rx skb timestamps */ | 2918 | /* rx skb timestamps */ |
| 2868 | extern void net_enable_timestamp(void); | 2919 | void net_enable_timestamp(void); |
| 2869 | extern void net_disable_timestamp(void); | 2920 | void net_disable_timestamp(void); |
| 2870 | 2921 | ||
| 2871 | #ifdef CONFIG_PROC_FS | 2922 | #ifdef CONFIG_PROC_FS |
| 2872 | extern int __init dev_proc_init(void); | 2923 | int __init dev_proc_init(void); |
| 2873 | #else | 2924 | #else |
| 2874 | #define dev_proc_init() 0 | 2925 | #define dev_proc_init() 0 |
| 2875 | #endif | 2926 | #endif |
| 2876 | 2927 | ||
| 2877 | extern int netdev_class_create_file_ns(struct class_attribute *class_attr, | 2928 | int netdev_class_create_file_ns(struct class_attribute *class_attr, |
| 2878 | const void *ns); | 2929 | const void *ns); |
| 2879 | extern void netdev_class_remove_file_ns(struct class_attribute *class_attr, | 2930 | void netdev_class_remove_file_ns(struct class_attribute *class_attr, |
| 2880 | const void *ns); | 2931 | const void *ns); |
| 2881 | 2932 | ||
| 2882 | static inline int netdev_class_create_file(struct class_attribute *class_attr) | 2933 | static inline int netdev_class_create_file(struct class_attribute *class_attr) |
| 2883 | { | 2934 | { |
| @@ -2891,9 +2942,9 @@ static inline void netdev_class_remove_file(struct class_attribute *class_attr) | |||
| 2891 | 2942 | ||
| 2892 | extern struct kobj_ns_type_operations net_ns_type_operations; | 2943 | extern struct kobj_ns_type_operations net_ns_type_operations; |
| 2893 | 2944 | ||
| 2894 | extern const char *netdev_drivername(const struct net_device *dev); | 2945 | const char *netdev_drivername(const struct net_device *dev); |
| 2895 | 2946 | ||
| 2896 | extern void linkwatch_run_queue(void); | 2947 | void linkwatch_run_queue(void); |
| 2897 | 2948 | ||
| 2898 | static inline netdev_features_t netdev_get_wanted_features( | 2949 | static inline netdev_features_t netdev_get_wanted_features( |
| 2899 | struct net_device *dev) | 2950 | struct net_device *dev) |
| @@ -2957,6 +3008,11 @@ static inline void netif_set_gso_max_size(struct net_device *dev, | |||
| 2957 | dev->gso_max_size = size; | 3008 | dev->gso_max_size = size; |
| 2958 | } | 3009 | } |
| 2959 | 3010 | ||
| 3011 | static inline bool netif_is_macvlan(struct net_device *dev) | ||
| 3012 | { | ||
| 3013 | return dev->priv_flags & IFF_MACVLAN; | ||
| 3014 | } | ||
| 3015 | |||
| 2960 | static inline bool netif_is_bond_master(struct net_device *dev) | 3016 | static inline bool netif_is_bond_master(struct net_device *dev) |
| 2961 | { | 3017 | { |
| 2962 | return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING; | 3018 | return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING; |
| @@ -2985,22 +3041,22 @@ static inline const char *netdev_name(const struct net_device *dev) | |||
| 2985 | return dev->name; | 3041 | return dev->name; |
| 2986 | } | 3042 | } |
| 2987 | 3043 | ||
| 2988 | extern __printf(3, 4) | 3044 | __printf(3, 4) |
| 2989 | int netdev_printk(const char *level, const struct net_device *dev, | 3045 | int netdev_printk(const char *level, const struct net_device *dev, |
| 2990 | const char *format, ...); | 3046 | const char *format, ...); |
| 2991 | extern __printf(2, 3) | 3047 | __printf(2, 3) |
| 2992 | int netdev_emerg(const struct net_device *dev, const char *format, ...); | 3048 | int netdev_emerg(const struct net_device *dev, const char *format, ...); |
| 2993 | extern __printf(2, 3) | 3049 | __printf(2, 3) |
| 2994 | int netdev_alert(const struct net_device *dev, const char *format, ...); | 3050 | int netdev_alert(const struct net_device *dev, const char *format, ...); |
| 2995 | extern __printf(2, 3) | 3051 | __printf(2, 3) |
| 2996 | int netdev_crit(const struct net_device *dev, const char *format, ...); | 3052 | int netdev_crit(const struct net_device *dev, const char *format, ...); |
| 2997 | extern __printf(2, 3) | 3053 | __printf(2, 3) |
| 2998 | int netdev_err(const struct net_device *dev, const char *format, ...); | 3054 | int netdev_err(const struct net_device *dev, const char *format, ...); |
| 2999 | extern __printf(2, 3) | 3055 | __printf(2, 3) |
| 3000 | int netdev_warn(const struct net_device *dev, const char *format, ...); | 3056 | int netdev_warn(const struct net_device *dev, const char *format, ...); |
| 3001 | extern __printf(2, 3) | 3057 | __printf(2, 3) |
| 3002 | int netdev_notice(const struct net_device *dev, const char *format, ...); | 3058 | int netdev_notice(const struct net_device *dev, const char *format, ...); |
| 3003 | extern __printf(2, 3) | 3059 | __printf(2, 3) |
| 3004 | int netdev_info(const struct net_device *dev, const char *format, ...); | 3060 | int netdev_info(const struct net_device *dev, const char *format, ...); |
| 3005 | 3061 | ||
| 3006 | #define MODULE_ALIAS_NETDEV(device) \ | 3062 | #define MODULE_ALIAS_NETDEV(device) \ |
| @@ -3041,7 +3097,7 @@ do { \ | |||
| 3041 | * file/line information and a backtrace. | 3097 | * file/line information and a backtrace. |
| 3042 | */ | 3098 | */ |
| 3043 | #define netdev_WARN(dev, format, args...) \ | 3099 | #define netdev_WARN(dev, format, args...) \ |
| 3044 | WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args); | 3100 | WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args) |
| 3045 | 3101 | ||
| 3046 | /* netif printk helpers, similar to netdev_printk */ | 3102 | /* netif printk helpers, similar to netdev_printk */ |
| 3047 | 3103 | ||
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 708fe72ab913..2077489f9887 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
| @@ -35,14 +35,15 @@ static inline void nf_inet_addr_mask(const union nf_inet_addr *a1, | |||
| 35 | result->all[3] = a1->all[3] & mask->all[3]; | 35 | result->all[3] = a1->all[3] & mask->all[3]; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | extern int netfilter_init(void); | 38 | int netfilter_init(void); |
| 39 | 39 | ||
| 40 | /* Largest hook number + 1 */ | 40 | /* Largest hook number + 1 */ |
| 41 | #define NF_MAX_HOOKS 8 | 41 | #define NF_MAX_HOOKS 8 |
| 42 | 42 | ||
| 43 | struct sk_buff; | 43 | struct sk_buff; |
| 44 | 44 | ||
| 45 | typedef unsigned int nf_hookfn(unsigned int hooknum, | 45 | struct nf_hook_ops; |
| 46 | typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops, | ||
| 46 | struct sk_buff *skb, | 47 | struct sk_buff *skb, |
| 47 | const struct net_device *in, | 48 | const struct net_device *in, |
| 48 | const struct net_device *out, | 49 | const struct net_device *out, |
| @@ -52,12 +53,13 @@ struct nf_hook_ops { | |||
| 52 | struct list_head list; | 53 | struct list_head list; |
| 53 | 54 | ||
| 54 | /* User fills in from here down. */ | 55 | /* User fills in from here down. */ |
| 55 | nf_hookfn *hook; | 56 | nf_hookfn *hook; |
| 56 | struct module *owner; | 57 | struct module *owner; |
| 57 | u_int8_t pf; | 58 | void *priv; |
| 58 | unsigned int hooknum; | 59 | u_int8_t pf; |
| 60 | unsigned int hooknum; | ||
| 59 | /* Hooks are ordered in ascending priority. */ | 61 | /* Hooks are ordered in ascending priority. */ |
| 60 | int priority; | 62 | int priority; |
| 61 | }; | 63 | }; |
| 62 | 64 | ||
| 63 | struct nf_sockopt_ops { | 65 | struct nf_sockopt_ops { |
| @@ -208,7 +210,7 @@ int compat_nf_getsockopt(struct sock *sk, u_int8_t pf, int optval, | |||
| 208 | /* Call this before modifying an existing packet: ensures it is | 210 | /* Call this before modifying an existing packet: ensures it is |
| 209 | modifiable and linear to the point you care about (writable_len). | 211 | modifiable and linear to the point you care about (writable_len). |
| 210 | Returns true or false. */ | 212 | Returns true or false. */ |
| 211 | extern int skb_make_writable(struct sk_buff *skb, unsigned int writable_len); | 213 | int skb_make_writable(struct sk_buff *skb, unsigned int writable_len); |
| 212 | 214 | ||
| 213 | struct flowi; | 215 | struct flowi; |
| 214 | struct nf_queue_entry; | 216 | struct nf_queue_entry; |
| @@ -269,8 +271,8 @@ nf_checksum_partial(struct sk_buff *skb, unsigned int hook, | |||
| 269 | return csum; | 271 | return csum; |
| 270 | } | 272 | } |
| 271 | 273 | ||
| 272 | extern int nf_register_afinfo(const struct nf_afinfo *afinfo); | 274 | int nf_register_afinfo(const struct nf_afinfo *afinfo); |
| 273 | extern void nf_unregister_afinfo(const struct nf_afinfo *afinfo); | 275 | void nf_unregister_afinfo(const struct nf_afinfo *afinfo); |
| 274 | 276 | ||
| 275 | #include <net/flow.h> | 277 | #include <net/flow.h> |
| 276 | extern void (*nf_nat_decode_session_hook)(struct sk_buff *, struct flowi *); | 278 | extern void (*nf_nat_decode_session_hook)(struct sk_buff *, struct flowi *); |
| @@ -315,7 +317,7 @@ nf_nat_decode_session(struct sk_buff *skb, struct flowi *fl, u_int8_t family) | |||
| 315 | 317 | ||
| 316 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 318 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
| 317 | extern void (*ip_ct_attach)(struct sk_buff *, const struct sk_buff *) __rcu; | 319 | extern void (*ip_ct_attach)(struct sk_buff *, const struct sk_buff *) __rcu; |
| 318 | extern void nf_ct_attach(struct sk_buff *, const struct sk_buff *); | 320 | void nf_ct_attach(struct sk_buff *, const struct sk_buff *); |
| 319 | extern void (*nf_ct_destroy)(struct nf_conntrack *) __rcu; | 321 | extern void (*nf_ct_destroy)(struct nf_conntrack *) __rcu; |
| 320 | 322 | ||
| 321 | struct nf_conn; | 323 | struct nf_conn; |
diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h index 9ac9fbde7b61..c7174b816674 100644 --- a/include/linux/netfilter/ipset/ip_set.h +++ b/include/linux/netfilter/ipset/ip_set.h | |||
| @@ -49,31 +49,68 @@ enum ip_set_feature { | |||
| 49 | 49 | ||
| 50 | /* Set extensions */ | 50 | /* Set extensions */ |
| 51 | enum ip_set_extension { | 51 | enum ip_set_extension { |
| 52 | IPSET_EXT_NONE = 0, | 52 | IPSET_EXT_BIT_TIMEOUT = 0, |
| 53 | IPSET_EXT_BIT_TIMEOUT = 1, | ||
| 54 | IPSET_EXT_TIMEOUT = (1 << IPSET_EXT_BIT_TIMEOUT), | 53 | IPSET_EXT_TIMEOUT = (1 << IPSET_EXT_BIT_TIMEOUT), |
| 55 | IPSET_EXT_BIT_COUNTER = 2, | 54 | IPSET_EXT_BIT_COUNTER = 1, |
| 56 | IPSET_EXT_COUNTER = (1 << IPSET_EXT_BIT_COUNTER), | 55 | IPSET_EXT_COUNTER = (1 << IPSET_EXT_BIT_COUNTER), |
| 57 | }; | 56 | IPSET_EXT_BIT_COMMENT = 2, |
| 58 | 57 | IPSET_EXT_COMMENT = (1 << IPSET_EXT_BIT_COMMENT), | |
| 59 | /* Extension offsets */ | 58 | /* Mark set with an extension which needs to call destroy */ |
| 60 | enum ip_set_offset { | 59 | IPSET_EXT_BIT_DESTROY = 7, |
| 61 | IPSET_OFFSET_TIMEOUT = 0, | 60 | IPSET_EXT_DESTROY = (1 << IPSET_EXT_BIT_DESTROY), |
| 62 | IPSET_OFFSET_COUNTER, | ||
| 63 | IPSET_OFFSET_MAX, | ||
| 64 | }; | 61 | }; |
| 65 | 62 | ||
| 66 | #define SET_WITH_TIMEOUT(s) ((s)->extensions & IPSET_EXT_TIMEOUT) | 63 | #define SET_WITH_TIMEOUT(s) ((s)->extensions & IPSET_EXT_TIMEOUT) |
| 67 | #define SET_WITH_COUNTER(s) ((s)->extensions & IPSET_EXT_COUNTER) | 64 | #define SET_WITH_COUNTER(s) ((s)->extensions & IPSET_EXT_COUNTER) |
| 65 | #define SET_WITH_COMMENT(s) ((s)->extensions & IPSET_EXT_COMMENT) | ||
| 66 | |||
| 67 | /* Extension id, in size order */ | ||
| 68 | enum ip_set_ext_id { | ||
| 69 | IPSET_EXT_ID_COUNTER = 0, | ||
| 70 | IPSET_EXT_ID_TIMEOUT, | ||
| 71 | IPSET_EXT_ID_COMMENT, | ||
| 72 | IPSET_EXT_ID_MAX, | ||
| 73 | }; | ||
| 74 | |||
| 75 | /* Extension type */ | ||
| 76 | struct ip_set_ext_type { | ||
| 77 | /* Destroy extension private data (can be NULL) */ | ||
| 78 | void (*destroy)(void *ext); | ||
| 79 | enum ip_set_extension type; | ||
| 80 | enum ipset_cadt_flags flag; | ||
| 81 | /* Size and minimal alignment */ | ||
| 82 | u8 len; | ||
| 83 | u8 align; | ||
| 84 | }; | ||
| 85 | |||
| 86 | extern const struct ip_set_ext_type ip_set_extensions[]; | ||
| 68 | 87 | ||
| 69 | struct ip_set_ext { | 88 | struct ip_set_ext { |
| 70 | unsigned long timeout; | ||
| 71 | u64 packets; | 89 | u64 packets; |
| 72 | u64 bytes; | 90 | u64 bytes; |
| 91 | u32 timeout; | ||
| 92 | char *comment; | ||
| 93 | }; | ||
| 94 | |||
| 95 | struct ip_set_counter { | ||
| 96 | atomic64_t bytes; | ||
| 97 | atomic64_t packets; | ||
| 98 | }; | ||
| 99 | |||
| 100 | struct ip_set_comment { | ||
| 101 | char *str; | ||
| 73 | }; | 102 | }; |
| 74 | 103 | ||
| 75 | struct ip_set; | 104 | struct ip_set; |
| 76 | 105 | ||
| 106 | #define ext_timeout(e, s) \ | ||
| 107 | (unsigned long *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_TIMEOUT]) | ||
| 108 | #define ext_counter(e, s) \ | ||
| 109 | (struct ip_set_counter *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_COUNTER]) | ||
| 110 | #define ext_comment(e, s) \ | ||
| 111 | (struct ip_set_comment *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_COMMENT]) | ||
| 112 | |||
| 113 | |||
| 77 | typedef int (*ipset_adtfn)(struct ip_set *set, void *value, | 114 | typedef int (*ipset_adtfn)(struct ip_set *set, void *value, |
| 78 | const struct ip_set_ext *ext, | 115 | const struct ip_set_ext *ext, |
| 79 | struct ip_set_ext *mext, u32 cmdflags); | 116 | struct ip_set_ext *mext, u32 cmdflags); |
| @@ -147,7 +184,8 @@ struct ip_set_type { | |||
| 147 | u8 revision_min, revision_max; | 184 | u8 revision_min, revision_max; |
| 148 | 185 | ||
| 149 | /* Create set */ | 186 | /* Create set */ |
| 150 | int (*create)(struct ip_set *set, struct nlattr *tb[], u32 flags); | 187 | int (*create)(struct net *net, struct ip_set *set, |
| 188 | struct nlattr *tb[], u32 flags); | ||
| 151 | 189 | ||
| 152 | /* Attribute policies */ | 190 | /* Attribute policies */ |
| 153 | const struct nla_policy create_policy[IPSET_ATTR_CREATE_MAX + 1]; | 191 | const struct nla_policy create_policy[IPSET_ATTR_CREATE_MAX + 1]; |
| @@ -179,14 +217,45 @@ struct ip_set { | |||
| 179 | u8 revision; | 217 | u8 revision; |
| 180 | /* Extensions */ | 218 | /* Extensions */ |
| 181 | u8 extensions; | 219 | u8 extensions; |
| 220 | /* Default timeout value, if enabled */ | ||
| 221 | u32 timeout; | ||
| 222 | /* Element data size */ | ||
| 223 | size_t dsize; | ||
| 224 | /* Offsets to extensions in elements */ | ||
| 225 | size_t offset[IPSET_EXT_ID_MAX]; | ||
| 182 | /* The type specific data */ | 226 | /* The type specific data */ |
| 183 | void *data; | 227 | void *data; |
| 184 | }; | 228 | }; |
| 185 | 229 | ||
| 186 | struct ip_set_counter { | 230 | static inline void |
| 187 | atomic64_t bytes; | 231 | ip_set_ext_destroy(struct ip_set *set, void *data) |
| 188 | atomic64_t packets; | 232 | { |
| 189 | }; | 233 | /* Check that the extension is enabled for the set and |
| 234 | * call it's destroy function for its extension part in data. | ||
| 235 | */ | ||
| 236 | if (SET_WITH_COMMENT(set)) | ||
| 237 | ip_set_extensions[IPSET_EXT_ID_COMMENT].destroy( | ||
| 238 | ext_comment(data, set)); | ||
| 239 | } | ||
| 240 | |||
| 241 | static inline int | ||
| 242 | ip_set_put_flags(struct sk_buff *skb, struct ip_set *set) | ||
| 243 | { | ||
| 244 | u32 cadt_flags = 0; | ||
| 245 | |||
| 246 | if (SET_WITH_TIMEOUT(set)) | ||
| 247 | if (unlikely(nla_put_net32(skb, IPSET_ATTR_TIMEOUT, | ||
| 248 | htonl(set->timeout)))) | ||
| 249 | return -EMSGSIZE; | ||
| 250 | if (SET_WITH_COUNTER(set)) | ||
| 251 | cadt_flags |= IPSET_FLAG_WITH_COUNTERS; | ||
| 252 | if (SET_WITH_COMMENT(set)) | ||
| 253 | cadt_flags |= IPSET_FLAG_WITH_COMMENT; | ||
| 254 | |||
| 255 | if (!cadt_flags) | ||
| 256 | return 0; | ||
| 257 | return nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(cadt_flags)); | ||
| 258 | } | ||
| 190 | 259 | ||
| 191 | static inline void | 260 | static inline void |
| 192 | ip_set_add_bytes(u64 bytes, struct ip_set_counter *counter) | 261 | ip_set_add_bytes(u64 bytes, struct ip_set_counter *counter) |
| @@ -247,13 +316,24 @@ ip_set_init_counter(struct ip_set_counter *counter, | |||
| 247 | atomic64_set(&(counter)->packets, (long long)(ext->packets)); | 316 | atomic64_set(&(counter)->packets, (long long)(ext->packets)); |
| 248 | } | 317 | } |
| 249 | 318 | ||
| 319 | /* Netlink CB args */ | ||
| 320 | enum { | ||
| 321 | IPSET_CB_NET = 0, | ||
| 322 | IPSET_CB_DUMP, | ||
| 323 | IPSET_CB_INDEX, | ||
| 324 | IPSET_CB_ARG0, | ||
| 325 | IPSET_CB_ARG1, | ||
| 326 | IPSET_CB_ARG2, | ||
| 327 | }; | ||
| 328 | |||
| 250 | /* register and unregister set references */ | 329 | /* register and unregister set references */ |
| 251 | extern ip_set_id_t ip_set_get_byname(const char *name, struct ip_set **set); | 330 | extern ip_set_id_t ip_set_get_byname(struct net *net, |
| 252 | extern void ip_set_put_byindex(ip_set_id_t index); | 331 | const char *name, struct ip_set **set); |
| 253 | extern const char *ip_set_name_byindex(ip_set_id_t index); | 332 | extern void ip_set_put_byindex(struct net *net, ip_set_id_t index); |
| 254 | extern ip_set_id_t ip_set_nfnl_get(const char *name); | 333 | extern const char *ip_set_name_byindex(struct net *net, ip_set_id_t index); |
| 255 | extern ip_set_id_t ip_set_nfnl_get_byindex(ip_set_id_t index); | 334 | extern ip_set_id_t ip_set_nfnl_get(struct net *net, const char *name); |
| 256 | extern void ip_set_nfnl_put(ip_set_id_t index); | 335 | extern ip_set_id_t ip_set_nfnl_get_byindex(struct net *net, ip_set_id_t index); |
| 336 | extern void ip_set_nfnl_put(struct net *net, ip_set_id_t index); | ||
| 257 | 337 | ||
| 258 | /* API for iptables set match, and SET target */ | 338 | /* API for iptables set match, and SET target */ |
| 259 | 339 | ||
| @@ -272,6 +352,8 @@ extern void *ip_set_alloc(size_t size); | |||
| 272 | extern void ip_set_free(void *members); | 352 | extern void ip_set_free(void *members); |
| 273 | extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr); | 353 | extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr); |
| 274 | extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); | 354 | extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); |
| 355 | extern size_t ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], | ||
| 356 | size_t len); | ||
| 275 | extern int ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[], | 357 | extern int ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[], |
| 276 | struct ip_set_ext *ext); | 358 | struct ip_set_ext *ext); |
| 277 | 359 | ||
| @@ -389,13 +471,40 @@ bitmap_bytes(u32 a, u32 b) | |||
| 389 | } | 471 | } |
| 390 | 472 | ||
| 391 | #include <linux/netfilter/ipset/ip_set_timeout.h> | 473 | #include <linux/netfilter/ipset/ip_set_timeout.h> |
| 474 | #include <linux/netfilter/ipset/ip_set_comment.h> | ||
| 475 | |||
| 476 | static inline int | ||
| 477 | ip_set_put_extensions(struct sk_buff *skb, const struct ip_set *set, | ||
| 478 | const void *e, bool active) | ||
| 479 | { | ||
| 480 | if (SET_WITH_TIMEOUT(set)) { | ||
| 481 | unsigned long *timeout = ext_timeout(e, set); | ||
| 482 | |||
| 483 | if (nla_put_net32(skb, IPSET_ATTR_TIMEOUT, | ||
| 484 | htonl(active ? ip_set_timeout_get(timeout) | ||
| 485 | : *timeout))) | ||
| 486 | return -EMSGSIZE; | ||
| 487 | } | ||
| 488 | if (SET_WITH_COUNTER(set) && | ||
| 489 | ip_set_put_counter(skb, ext_counter(e, set))) | ||
| 490 | return -EMSGSIZE; | ||
| 491 | if (SET_WITH_COMMENT(set) && | ||
| 492 | ip_set_put_comment(skb, ext_comment(e, set))) | ||
| 493 | return -EMSGSIZE; | ||
| 494 | return 0; | ||
| 495 | } | ||
| 392 | 496 | ||
| 393 | #define IP_SET_INIT_KEXT(skb, opt, map) \ | 497 | #define IP_SET_INIT_KEXT(skb, opt, set) \ |
| 394 | { .bytes = (skb)->len, .packets = 1, \ | 498 | { .bytes = (skb)->len, .packets = 1, \ |
| 395 | .timeout = ip_set_adt_opt_timeout(opt, map) } | 499 | .timeout = ip_set_adt_opt_timeout(opt, set) } |
| 396 | 500 | ||
| 397 | #define IP_SET_INIT_UEXT(map) \ | 501 | #define IP_SET_INIT_UEXT(set) \ |
| 398 | { .bytes = ULLONG_MAX, .packets = ULLONG_MAX, \ | 502 | { .bytes = ULLONG_MAX, .packets = ULLONG_MAX, \ |
| 399 | .timeout = (map)->timeout } | 503 | .timeout = (set)->timeout } |
| 504 | |||
| 505 | #define IP_SET_INIT_CIDR(a, b) ((a) ? (a) : (b)) | ||
| 506 | |||
| 507 | #define IPSET_CONCAT(a, b) a##b | ||
| 508 | #define IPSET_TOKEN(a, b) IPSET_CONCAT(a, b) | ||
| 400 | 509 | ||
| 401 | #endif /*_IP_SET_H */ | 510 | #endif /*_IP_SET_H */ |
diff --git a/include/linux/netfilter/ipset/ip_set_comment.h b/include/linux/netfilter/ipset/ip_set_comment.h new file mode 100644 index 000000000000..21217ea008d7 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_comment.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | #ifndef _IP_SET_COMMENT_H | ||
| 2 | #define _IP_SET_COMMENT_H | ||
| 3 | |||
| 4 | /* Copyright (C) 2013 Oliver Smith <oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifdef __KERNEL__ | ||
| 12 | |||
| 13 | static inline char* | ||
| 14 | ip_set_comment_uget(struct nlattr *tb) | ||
| 15 | { | ||
| 16 | return nla_data(tb); | ||
| 17 | } | ||
| 18 | |||
| 19 | static inline void | ||
| 20 | ip_set_init_comment(struct ip_set_comment *comment, | ||
| 21 | const struct ip_set_ext *ext) | ||
| 22 | { | ||
| 23 | size_t len = ext->comment ? strlen(ext->comment) : 0; | ||
| 24 | |||
| 25 | if (unlikely(comment->str)) { | ||
| 26 | kfree(comment->str); | ||
| 27 | comment->str = NULL; | ||
| 28 | } | ||
| 29 | if (!len) | ||
| 30 | return; | ||
| 31 | if (unlikely(len > IPSET_MAX_COMMENT_SIZE)) | ||
| 32 | len = IPSET_MAX_COMMENT_SIZE; | ||
| 33 | comment->str = kzalloc(len + 1, GFP_ATOMIC); | ||
| 34 | if (unlikely(!comment->str)) | ||
| 35 | return; | ||
| 36 | strlcpy(comment->str, ext->comment, len + 1); | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline int | ||
| 40 | ip_set_put_comment(struct sk_buff *skb, struct ip_set_comment *comment) | ||
| 41 | { | ||
| 42 | if (!comment->str) | ||
| 43 | return 0; | ||
| 44 | return nla_put_string(skb, IPSET_ATTR_COMMENT, comment->str); | ||
| 45 | } | ||
| 46 | |||
| 47 | static inline void | ||
| 48 | ip_set_comment_free(struct ip_set_comment *comment) | ||
| 49 | { | ||
| 50 | if (unlikely(!comment->str)) | ||
| 51 | return; | ||
| 52 | kfree(comment->str); | ||
| 53 | comment->str = NULL; | ||
| 54 | } | ||
| 55 | |||
| 56 | #endif | ||
| 57 | #endif | ||
diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h index 3aac04167ca7..83c2f9e0886c 100644 --- a/include/linux/netfilter/ipset/ip_set_timeout.h +++ b/include/linux/netfilter/ipset/ip_set_timeout.h | |||
| @@ -23,8 +23,8 @@ | |||
| 23 | /* Set is defined with timeout support: timeout value may be 0 */ | 23 | /* Set is defined with timeout support: timeout value may be 0 */ |
| 24 | #define IPSET_NO_TIMEOUT UINT_MAX | 24 | #define IPSET_NO_TIMEOUT UINT_MAX |
| 25 | 25 | ||
| 26 | #define ip_set_adt_opt_timeout(opt, map) \ | 26 | #define ip_set_adt_opt_timeout(opt, set) \ |
| 27 | ((opt)->ext.timeout != IPSET_NO_TIMEOUT ? (opt)->ext.timeout : (map)->timeout) | 27 | ((opt)->ext.timeout != IPSET_NO_TIMEOUT ? (opt)->ext.timeout : (set)->timeout) |
| 28 | 28 | ||
| 29 | static inline unsigned int | 29 | static inline unsigned int |
| 30 | ip_set_timeout_uget(struct nlattr *tb) | 30 | ip_set_timeout_uget(struct nlattr *tb) |
diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 127d0b90604f..275505792664 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h | |||
| @@ -23,6 +23,6 @@ struct ip_conntrack_stat { | |||
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | /* call to create an explicit dependency on nf_conntrack. */ | 25 | /* call to create an explicit dependency on nf_conntrack. */ |
| 26 | extern void need_conntrack(void); | 26 | void need_conntrack(void); |
| 27 | 27 | ||
| 28 | #endif /* _NF_CONNTRACK_COMMON_H */ | 28 | #endif /* _NF_CONNTRACK_COMMON_H */ |
diff --git a/include/linux/netfilter/nf_conntrack_h323.h b/include/linux/netfilter/nf_conntrack_h323.h index f381020eee92..858d9b214053 100644 --- a/include/linux/netfilter/nf_conntrack_h323.h +++ b/include/linux/netfilter/nf_conntrack_h323.h | |||
| @@ -29,13 +29,13 @@ struct nf_ct_h323_master { | |||
| 29 | 29 | ||
| 30 | struct nf_conn; | 30 | struct nf_conn; |
| 31 | 31 | ||
| 32 | extern int get_h225_addr(struct nf_conn *ct, unsigned char *data, | 32 | int get_h225_addr(struct nf_conn *ct, unsigned char *data, |
| 33 | TransportAddress *taddr, | 33 | TransportAddress *taddr, union nf_inet_addr *addr, |
| 34 | union nf_inet_addr *addr, __be16 *port); | 34 | __be16 *port); |
| 35 | extern void nf_conntrack_h245_expect(struct nf_conn *new, | 35 | void nf_conntrack_h245_expect(struct nf_conn *new, |
| 36 | struct nf_conntrack_expect *this); | 36 | struct nf_conntrack_expect *this); |
| 37 | extern void nf_conntrack_q931_expect(struct nf_conn *new, | 37 | void nf_conntrack_q931_expect(struct nf_conn *new, |
| 38 | struct nf_conntrack_expect *this); | 38 | struct nf_conntrack_expect *this); |
| 39 | extern int (*set_h245_addr_hook) (struct sk_buff *skb, unsigned int protoff, | 39 | extern int (*set_h245_addr_hook) (struct sk_buff *skb, unsigned int protoff, |
| 40 | unsigned char **data, int dataoff, | 40 | unsigned char **data, int dataoff, |
| 41 | H245_TransportAddress *taddr, | 41 | H245_TransportAddress *taddr, |
diff --git a/include/linux/netfilter/nf_conntrack_proto_gre.h b/include/linux/netfilter/nf_conntrack_proto_gre.h index 6a0664c0c451..ec2ffaf418c8 100644 --- a/include/linux/netfilter/nf_conntrack_proto_gre.h +++ b/include/linux/netfilter/nf_conntrack_proto_gre.h | |||
| @@ -87,8 +87,8 @@ int nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir, | |||
| 87 | /* delete keymap entries */ | 87 | /* delete keymap entries */ |
| 88 | void nf_ct_gre_keymap_destroy(struct nf_conn *ct); | 88 | void nf_ct_gre_keymap_destroy(struct nf_conn *ct); |
| 89 | 89 | ||
| 90 | extern void nf_ct_gre_keymap_flush(struct net *net); | 90 | void nf_ct_gre_keymap_flush(struct net *net); |
| 91 | extern void nf_nat_need_gre(void); | 91 | void nf_nat_need_gre(void); |
| 92 | 92 | ||
| 93 | #endif /* __KERNEL__ */ | 93 | #endif /* __KERNEL__ */ |
| 94 | #endif /* _CONNTRACK_PROTO_GRE_H */ | 94 | #endif /* _CONNTRACK_PROTO_GRE_H */ |
diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h index ba7f571a2b1c..d5af3c27fb7d 100644 --- a/include/linux/netfilter/nf_conntrack_sip.h +++ b/include/linux/netfilter/nf_conntrack_sip.h | |||
| @@ -107,85 +107,93 @@ enum sdp_header_types { | |||
| 107 | SDP_HDR_MEDIA, | 107 | SDP_HDR_MEDIA, |
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, | 110 | struct nf_nat_sip_hooks { |
| 111 | unsigned int protoff, | 111 | unsigned int (*msg)(struct sk_buff *skb, |
| 112 | unsigned int dataoff, | 112 | unsigned int protoff, |
| 113 | const char **dptr, | 113 | unsigned int dataoff, |
| 114 | unsigned int *datalen); | 114 | const char **dptr, |
| 115 | extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb, | 115 | unsigned int *datalen); |
| 116 | unsigned int protoff, s16 off); | 116 | |
| 117 | extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb, | 117 | void (*seq_adjust)(struct sk_buff *skb, |
| 118 | unsigned int protoff, | 118 | unsigned int protoff, s16 off); |
| 119 | unsigned int dataoff, | 119 | |
| 120 | const char **dptr, | 120 | unsigned int (*expect)(struct sk_buff *skb, |
| 121 | unsigned int *datalen, | 121 | unsigned int protoff, |
| 122 | struct nf_conntrack_expect *exp, | 122 | unsigned int dataoff, |
| 123 | unsigned int matchoff, | 123 | const char **dptr, |
| 124 | unsigned int matchlen); | 124 | unsigned int *datalen, |
| 125 | extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb, | 125 | struct nf_conntrack_expect *exp, |
| 126 | unsigned int protoff, | 126 | unsigned int matchoff, |
| 127 | unsigned int dataoff, | 127 | unsigned int matchlen); |
| 128 | const char **dptr, | 128 | |
| 129 | unsigned int *datalen, | 129 | unsigned int (*sdp_addr)(struct sk_buff *skb, |
| 130 | unsigned int sdpoff, | 130 | unsigned int protoff, |
| 131 | enum sdp_header_types type, | 131 | unsigned int dataoff, |
| 132 | enum sdp_header_types term, | 132 | const char **dptr, |
| 133 | const union nf_inet_addr *addr); | 133 | unsigned int *datalen, |
| 134 | extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb, | 134 | unsigned int sdpoff, |
| 135 | unsigned int protoff, | ||
| 136 | unsigned int dataoff, | ||
| 137 | const char **dptr, | ||
| 138 | unsigned int *datalen, | ||
| 139 | unsigned int matchoff, | ||
| 140 | unsigned int matchlen, | ||
| 141 | u_int16_t port); | ||
| 142 | extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb, | ||
| 143 | unsigned int protoff, | ||
| 144 | unsigned int dataoff, | ||
| 145 | const char **dptr, | ||
| 146 | unsigned int *datalen, | ||
| 147 | unsigned int sdpoff, | ||
| 148 | const union nf_inet_addr *addr); | ||
| 149 | extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb, | ||
| 150 | unsigned int protoff, | ||
| 151 | unsigned int dataoff, | ||
| 152 | const char **dptr, | ||
| 153 | unsigned int *datalen, | ||
| 154 | struct nf_conntrack_expect *rtp_exp, | ||
| 155 | struct nf_conntrack_expect *rtcp_exp, | ||
| 156 | unsigned int mediaoff, | ||
| 157 | unsigned int medialen, | ||
| 158 | union nf_inet_addr *rtp_addr); | ||
| 159 | |||
| 160 | extern int ct_sip_parse_request(const struct nf_conn *ct, | ||
| 161 | const char *dptr, unsigned int datalen, | ||
| 162 | unsigned int *matchoff, unsigned int *matchlen, | ||
| 163 | union nf_inet_addr *addr, __be16 *port); | ||
| 164 | extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, | ||
| 165 | unsigned int dataoff, unsigned int datalen, | ||
| 166 | enum sip_header_types type, | ||
| 167 | unsigned int *matchoff, unsigned int *matchlen); | ||
| 168 | extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr, | ||
| 169 | unsigned int *dataoff, unsigned int datalen, | ||
| 170 | enum sip_header_types type, int *in_header, | ||
| 171 | unsigned int *matchoff, unsigned int *matchlen, | ||
| 172 | union nf_inet_addr *addr, __be16 *port); | ||
| 173 | extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr, | ||
| 174 | unsigned int dataoff, unsigned int datalen, | ||
| 175 | const char *name, | ||
| 176 | unsigned int *matchoff, unsigned int *matchlen, | ||
| 177 | union nf_inet_addr *addr, bool delim); | ||
| 178 | extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr, | ||
| 179 | unsigned int off, unsigned int datalen, | ||
| 180 | const char *name, | ||
| 181 | unsigned int *matchoff, unsigned int *matchen, | ||
| 182 | unsigned int *val); | ||
| 183 | |||
| 184 | extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, | ||
| 185 | unsigned int dataoff, unsigned int datalen, | ||
| 186 | enum sdp_header_types type, | 135 | enum sdp_header_types type, |
| 187 | enum sdp_header_types term, | 136 | enum sdp_header_types term, |
| 188 | unsigned int *matchoff, unsigned int *matchlen); | 137 | const union nf_inet_addr *addr); |
| 138 | |||
| 139 | unsigned int (*sdp_port)(struct sk_buff *skb, | ||
| 140 | unsigned int protoff, | ||
| 141 | unsigned int dataoff, | ||
| 142 | const char **dptr, | ||
| 143 | unsigned int *datalen, | ||
| 144 | unsigned int matchoff, | ||
| 145 | unsigned int matchlen, | ||
| 146 | u_int16_t port); | ||
| 147 | |||
| 148 | unsigned int (*sdp_session)(struct sk_buff *skb, | ||
| 149 | unsigned int protoff, | ||
| 150 | unsigned int dataoff, | ||
| 151 | const char **dptr, | ||
| 152 | unsigned int *datalen, | ||
| 153 | unsigned int sdpoff, | ||
| 154 | const union nf_inet_addr *addr); | ||
| 155 | |||
| 156 | unsigned int (*sdp_media)(struct sk_buff *skb, | ||
| 157 | unsigned int protoff, | ||
| 158 | unsigned int dataoff, | ||
| 159 | const char **dptr, | ||
| 160 | unsigned int *datalen, | ||
| 161 | struct nf_conntrack_expect *rtp_exp, | ||
| 162 | struct nf_conntrack_expect *rtcp_exp, | ||
| 163 | unsigned int mediaoff, | ||
| 164 | unsigned int medialen, | ||
| 165 | union nf_inet_addr *rtp_addr); | ||
| 166 | }; | ||
| 167 | extern const struct nf_nat_sip_hooks *nf_nat_sip_hooks; | ||
| 168 | |||
| 169 | int ct_sip_parse_request(const struct nf_conn *ct, const char *dptr, | ||
| 170 | unsigned int datalen, unsigned int *matchoff, | ||
| 171 | unsigned int *matchlen, union nf_inet_addr *addr, | ||
| 172 | __be16 *port); | ||
| 173 | int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, | ||
| 174 | unsigned int dataoff, unsigned int datalen, | ||
| 175 | enum sip_header_types type, unsigned int *matchoff, | ||
| 176 | unsigned int *matchlen); | ||
| 177 | int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr, | ||
| 178 | unsigned int *dataoff, unsigned int datalen, | ||
| 179 | enum sip_header_types type, int *in_header, | ||
| 180 | unsigned int *matchoff, unsigned int *matchlen, | ||
| 181 | union nf_inet_addr *addr, __be16 *port); | ||
| 182 | int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr, | ||
| 183 | unsigned int dataoff, unsigned int datalen, | ||
| 184 | const char *name, unsigned int *matchoff, | ||
| 185 | unsigned int *matchlen, union nf_inet_addr *addr, | ||
| 186 | bool delim); | ||
| 187 | int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr, | ||
| 188 | unsigned int off, unsigned int datalen, | ||
| 189 | const char *name, unsigned int *matchoff, | ||
| 190 | unsigned int *matchen, unsigned int *val); | ||
| 191 | |||
| 192 | int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, | ||
| 193 | unsigned int dataoff, unsigned int datalen, | ||
| 194 | enum sdp_header_types type, | ||
| 195 | enum sdp_header_types term, | ||
| 196 | unsigned int *matchoff, unsigned int *matchlen); | ||
| 189 | 197 | ||
| 190 | #endif /* __KERNEL__ */ | 198 | #endif /* __KERNEL__ */ |
| 191 | #endif /* __NF_CONNTRACK_SIP_H__ */ | 199 | #endif /* __NF_CONNTRACK_SIP_H__ */ |
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index cadb7402d7a7..28c74367e900 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h | |||
| @@ -14,6 +14,9 @@ struct nfnl_callback { | |||
| 14 | int (*call_rcu)(struct sock *nl, struct sk_buff *skb, | 14 | int (*call_rcu)(struct sock *nl, struct sk_buff *skb, |
| 15 | const struct nlmsghdr *nlh, | 15 | const struct nlmsghdr *nlh, |
| 16 | const struct nlattr * const cda[]); | 16 | const struct nlattr * const cda[]); |
| 17 | int (*call_batch)(struct sock *nl, struct sk_buff *skb, | ||
| 18 | const struct nlmsghdr *nlh, | ||
| 19 | const struct nlattr * const cda[]); | ||
| 17 | const struct nla_policy *policy; /* netlink attribute policy */ | 20 | const struct nla_policy *policy; /* netlink attribute policy */ |
| 18 | const u_int16_t attr_count; /* number of nlattr's */ | 21 | const u_int16_t attr_count; /* number of nlattr's */ |
| 19 | }; | 22 | }; |
| @@ -23,22 +26,24 @@ struct nfnetlink_subsystem { | |||
| 23 | __u8 subsys_id; /* nfnetlink subsystem ID */ | 26 | __u8 subsys_id; /* nfnetlink subsystem ID */ |
| 24 | __u8 cb_count; /* number of callbacks */ | 27 | __u8 cb_count; /* number of callbacks */ |
| 25 | const struct nfnl_callback *cb; /* callback for individual types */ | 28 | const struct nfnl_callback *cb; /* callback for individual types */ |
| 29 | int (*commit)(struct sk_buff *skb); | ||
| 30 | int (*abort)(struct sk_buff *skb); | ||
| 26 | }; | 31 | }; |
| 27 | 32 | ||
| 28 | extern int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); | 33 | int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); |
| 29 | extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); | 34 | int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); |
| 30 | 35 | ||
| 31 | extern int nfnetlink_has_listeners(struct net *net, unsigned int group); | 36 | int nfnetlink_has_listeners(struct net *net, unsigned int group); |
| 32 | extern struct sk_buff *nfnetlink_alloc_skb(struct net *net, unsigned int size, | 37 | struct sk_buff *nfnetlink_alloc_skb(struct net *net, unsigned int size, |
| 33 | u32 dst_portid, gfp_t gfp_mask); | 38 | u32 dst_portid, gfp_t gfp_mask); |
| 34 | extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, | 39 | int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, |
| 35 | unsigned int group, int echo, gfp_t flags); | 40 | unsigned int group, int echo, gfp_t flags); |
| 36 | extern int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); | 41 | int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); |
| 37 | extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, | 42 | int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u32 portid, |
| 38 | u32 portid, int flags); | 43 | int flags); |
| 39 | 44 | ||
| 40 | extern void nfnl_lock(__u8 subsys_id); | 45 | void nfnl_lock(__u8 subsys_id); |
| 41 | extern void nfnl_unlock(__u8 subsys_id); | 46 | void nfnl_unlock(__u8 subsys_id); |
| 42 | 47 | ||
| 43 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ | 48 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ |
| 44 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) | 49 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) |
diff --git a/include/linux/netfilter/nfnetlink_acct.h b/include/linux/netfilter/nfnetlink_acct.h index bb4bbc9b7a18..b2e85e59f760 100644 --- a/include/linux/netfilter/nfnetlink_acct.h +++ b/include/linux/netfilter/nfnetlink_acct.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | struct nf_acct; | 7 | struct nf_acct; |
| 8 | 8 | ||
| 9 | extern struct nf_acct *nfnl_acct_find_get(const char *filter_name); | 9 | struct nf_acct *nfnl_acct_find_get(const char *filter_name); |
| 10 | extern void nfnl_acct_put(struct nf_acct *acct); | 10 | void nfnl_acct_put(struct nf_acct *acct); |
| 11 | extern void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); | 11 | void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); |
| 12 | 12 | ||
| 13 | #endif /* _NFNL_ACCT_H */ | 13 | #endif /* _NFNL_ACCT_H */ |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index dd49566315c6..a3e215bb0241 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -229,50 +229,48 @@ struct xt_table_info { | |||
| 229 | 229 | ||
| 230 | #define XT_TABLE_INFO_SZ (offsetof(struct xt_table_info, entries) \ | 230 | #define XT_TABLE_INFO_SZ (offsetof(struct xt_table_info, entries) \ |
| 231 | + nr_cpu_ids * sizeof(char *)) | 231 | + nr_cpu_ids * sizeof(char *)) |
| 232 | extern int xt_register_target(struct xt_target *target); | 232 | int xt_register_target(struct xt_target *target); |
| 233 | extern void xt_unregister_target(struct xt_target *target); | 233 | void xt_unregister_target(struct xt_target *target); |
| 234 | extern int xt_register_targets(struct xt_target *target, unsigned int n); | 234 | int xt_register_targets(struct xt_target *target, unsigned int n); |
| 235 | extern void xt_unregister_targets(struct xt_target *target, unsigned int n); | 235 | void xt_unregister_targets(struct xt_target *target, unsigned int n); |
| 236 | 236 | ||
| 237 | extern int xt_register_match(struct xt_match *target); | 237 | int xt_register_match(struct xt_match *target); |
| 238 | extern void xt_unregister_match(struct xt_match *target); | 238 | void xt_unregister_match(struct xt_match *target); |
| 239 | extern int xt_register_matches(struct xt_match *match, unsigned int n); | 239 | int xt_register_matches(struct xt_match *match, unsigned int n); |
| 240 | extern void xt_unregister_matches(struct xt_match *match, unsigned int n); | 240 | void xt_unregister_matches(struct xt_match *match, unsigned int n); |
| 241 | 241 | ||
| 242 | extern int xt_check_match(struct xt_mtchk_param *, | 242 | int xt_check_match(struct xt_mtchk_param *, unsigned int size, u_int8_t proto, |
| 243 | unsigned int size, u_int8_t proto, bool inv_proto); | 243 | bool inv_proto); |
| 244 | extern int xt_check_target(struct xt_tgchk_param *, | 244 | int xt_check_target(struct xt_tgchk_param *, unsigned int size, u_int8_t proto, |
| 245 | unsigned int size, u_int8_t proto, bool inv_proto); | 245 | bool inv_proto); |
| 246 | 246 | ||
| 247 | extern struct xt_table *xt_register_table(struct net *net, | 247 | struct xt_table *xt_register_table(struct net *net, |
| 248 | const struct xt_table *table, | 248 | const struct xt_table *table, |
| 249 | struct xt_table_info *bootstrap, | 249 | struct xt_table_info *bootstrap, |
| 250 | struct xt_table_info *newinfo); | 250 | struct xt_table_info *newinfo); |
| 251 | extern void *xt_unregister_table(struct xt_table *table); | 251 | void *xt_unregister_table(struct xt_table *table); |
| 252 | 252 | ||
| 253 | extern struct xt_table_info *xt_replace_table(struct xt_table *table, | 253 | struct xt_table_info *xt_replace_table(struct xt_table *table, |
| 254 | unsigned int num_counters, | 254 | unsigned int num_counters, |
| 255 | struct xt_table_info *newinfo, | 255 | struct xt_table_info *newinfo, |
| 256 | int *error); | 256 | int *error); |
| 257 | 257 | ||
| 258 | extern struct xt_match *xt_find_match(u8 af, const char *name, u8 revision); | 258 | struct xt_match *xt_find_match(u8 af, const char *name, u8 revision); |
| 259 | extern struct xt_target *xt_find_target(u8 af, const char *name, u8 revision); | 259 | struct xt_target *xt_find_target(u8 af, const char *name, u8 revision); |
| 260 | extern struct xt_match *xt_request_find_match(u8 af, const char *name, | 260 | struct xt_match *xt_request_find_match(u8 af, const char *name, u8 revision); |
| 261 | u8 revision); | 261 | struct xt_target *xt_request_find_target(u8 af, const char *name, u8 revision); |
| 262 | extern struct xt_target *xt_request_find_target(u8 af, const char *name, | 262 | int xt_find_revision(u8 af, const char *name, u8 revision, int target, |
| 263 | u8 revision); | 263 | int *err); |
| 264 | extern int xt_find_revision(u8 af, const char *name, u8 revision, | 264 | |
| 265 | int target, int *err); | 265 | struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af, |
| 266 | 266 | const char *name); | |
| 267 | extern struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af, | 267 | void xt_table_unlock(struct xt_table *t); |
| 268 | const char *name); | 268 | |
| 269 | extern void xt_table_unlock(struct xt_table *t); | 269 | int xt_proto_init(struct net *net, u_int8_t af); |
| 270 | 270 | void xt_proto_fini(struct net *net, u_int8_t af); | |
| 271 | extern int xt_proto_init(struct net *net, u_int8_t af); | 271 | |
| 272 | extern void xt_proto_fini(struct net *net, u_int8_t af); | 272 | struct xt_table_info *xt_alloc_table_info(unsigned int size); |
| 273 | 273 | void xt_free_table_info(struct xt_table_info *info); | |
| 274 | extern struct xt_table_info *xt_alloc_table_info(unsigned int size); | ||
| 275 | extern void xt_free_table_info(struct xt_table_info *info); | ||
| 276 | 274 | ||
| 277 | /** | 275 | /** |
| 278 | * xt_recseq - recursive seqcount for netfilter use | 276 | * xt_recseq - recursive seqcount for netfilter use |
| @@ -353,8 +351,8 @@ static inline unsigned long ifname_compare_aligned(const char *_a, | |||
| 353 | return ret; | 351 | return ret; |
| 354 | } | 352 | } |
| 355 | 353 | ||
| 356 | extern struct nf_hook_ops *xt_hook_link(const struct xt_table *, nf_hookfn *); | 354 | struct nf_hook_ops *xt_hook_link(const struct xt_table *, nf_hookfn *); |
| 357 | extern void xt_hook_unlink(const struct xt_table *, struct nf_hook_ops *); | 355 | void xt_hook_unlink(const struct xt_table *, struct nf_hook_ops *); |
| 358 | 356 | ||
| 359 | #ifdef CONFIG_COMPAT | 357 | #ifdef CONFIG_COMPAT |
| 360 | #include <net/compat.h> | 358 | #include <net/compat.h> |
| @@ -414,25 +412,25 @@ struct _compat_xt_align { | |||
| 414 | 412 | ||
| 415 | #define COMPAT_XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _compat_xt_align)) | 413 | #define COMPAT_XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _compat_xt_align)) |
| 416 | 414 | ||
| 417 | extern void xt_compat_lock(u_int8_t af); | 415 | void xt_compat_lock(u_int8_t af); |
| 418 | extern void xt_compat_unlock(u_int8_t af); | 416 | void xt_compat_unlock(u_int8_t af); |
| 419 | 417 | ||
| 420 | extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta); | 418 | int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta); |
| 421 | extern void xt_compat_flush_offsets(u_int8_t af); | 419 | void xt_compat_flush_offsets(u_int8_t af); |
| 422 | extern void xt_compat_init_offsets(u_int8_t af, unsigned int number); | 420 | void xt_compat_init_offsets(u_int8_t af, unsigned int number); |
| 423 | extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); | 421 | int xt_compat_calc_jump(u_int8_t af, unsigned int offset); |
| 424 | 422 | ||
| 425 | extern int xt_compat_match_offset(const struct xt_match *match); | 423 | int xt_compat_match_offset(const struct xt_match *match); |
| 426 | extern int xt_compat_match_from_user(struct xt_entry_match *m, | 424 | int xt_compat_match_from_user(struct xt_entry_match *m, void **dstptr, |
| 427 | void **dstptr, unsigned int *size); | 425 | unsigned int *size); |
| 428 | extern int xt_compat_match_to_user(const struct xt_entry_match *m, | 426 | int xt_compat_match_to_user(const struct xt_entry_match *m, |
| 429 | void __user **dstptr, unsigned int *size); | 427 | void __user **dstptr, unsigned int *size); |
| 430 | 428 | ||
| 431 | extern int xt_compat_target_offset(const struct xt_target *target); | 429 | int xt_compat_target_offset(const struct xt_target *target); |
| 432 | extern void xt_compat_target_from_user(struct xt_entry_target *t, | 430 | void xt_compat_target_from_user(struct xt_entry_target *t, void **dstptr, |
| 433 | void **dstptr, unsigned int *size); | 431 | unsigned int *size); |
| 434 | extern int xt_compat_target_to_user(const struct xt_entry_target *t, | 432 | int xt_compat_target_to_user(const struct xt_entry_target *t, |
| 435 | void __user **dstptr, unsigned int *size); | 433 | void __user **dstptr, unsigned int *size); |
| 436 | 434 | ||
| 437 | #endif /* CONFIG_COMPAT */ | 435 | #endif /* CONFIG_COMPAT */ |
| 438 | #endif /* _X_TABLES_H */ | 436 | #endif /* _X_TABLES_H */ |
diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index dfb4d9e52bcb..8ab1c278b66d 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h | |||
| @@ -25,7 +25,7 @@ enum nf_br_hook_priorities { | |||
| 25 | #define BRNF_PPPoE 0x20 | 25 | #define BRNF_PPPoE 0x20 |
| 26 | 26 | ||
| 27 | /* Only used in br_forward.c */ | 27 | /* Only used in br_forward.c */ |
| 28 | extern int nf_bridge_copy_header(struct sk_buff *skb); | 28 | int nf_bridge_copy_header(struct sk_buff *skb); |
| 29 | static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb) | 29 | static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb) |
| 30 | { | 30 | { |
| 31 | if (skb->nf_bridge && | 31 | if (skb->nf_bridge && |
| @@ -53,7 +53,7 @@ static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | |||
| 53 | return 0; | 53 | return 0; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | extern int br_handle_frame_finish(struct sk_buff *skb); | 56 | int br_handle_frame_finish(struct sk_buff *skb); |
| 57 | /* Only used in br_device.c */ | 57 | /* Only used in br_device.c */ |
| 58 | static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb) | 58 | static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb) |
| 59 | { | 59 | { |
diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h index dfaf116b3e81..6e4591bb54d4 100644 --- a/include/linux/netfilter_ipv4.h +++ b/include/linux/netfilter_ipv4.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | #include <uapi/linux/netfilter_ipv4.h> | 7 | #include <uapi/linux/netfilter_ipv4.h> |
| 8 | 8 | ||
| 9 | extern int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type); | 9 | int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type); |
| 10 | extern __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, | 10 | __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, |
| 11 | unsigned int dataoff, u_int8_t protocol); | 11 | unsigned int dataoff, u_int8_t protocol); |
| 12 | #endif /*__LINUX_IP_NETFILTER_H*/ | 12 | #endif /*__LINUX_IP_NETFILTER_H*/ |
diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index 2d4df6ce043e..64dad1cc1a4b 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h | |||
| @@ -11,12 +11,12 @@ | |||
| 11 | 11 | ||
| 12 | 12 | ||
| 13 | #ifdef CONFIG_NETFILTER | 13 | #ifdef CONFIG_NETFILTER |
| 14 | extern int ip6_route_me_harder(struct sk_buff *skb); | 14 | int ip6_route_me_harder(struct sk_buff *skb); |
| 15 | extern __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, | 15 | __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, |
| 16 | unsigned int dataoff, u_int8_t protocol); | 16 | unsigned int dataoff, u_int8_t protocol); |
| 17 | 17 | ||
| 18 | extern int ipv6_netfilter_init(void); | 18 | int ipv6_netfilter_init(void); |
| 19 | extern void ipv6_netfilter_fini(void); | 19 | void ipv6_netfilter_fini(void); |
| 20 | 20 | ||
| 21 | /* | 21 | /* |
| 22 | * Hook functions for ipv6 to allow xt_* modules to be built-in even | 22 | * Hook functions for ipv6 to allow xt_* modules to be built-in even |
diff --git a/include/linux/random.h b/include/linux/random.h index 6312dd9ba449..4002b3df4c85 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
| @@ -29,8 +29,13 @@ unsigned long randomize_range(unsigned long start, unsigned long end, unsigned l | |||
| 29 | u32 prandom_u32(void); | 29 | u32 prandom_u32(void); |
| 30 | void prandom_bytes(void *buf, int nbytes); | 30 | void prandom_bytes(void *buf, int nbytes); |
| 31 | void prandom_seed(u32 seed); | 31 | void prandom_seed(u32 seed); |
| 32 | void prandom_reseed_late(void); | ||
| 32 | 33 | ||
| 33 | u32 prandom_u32_state(struct rnd_state *); | 34 | struct rnd_state { |
| 35 | __u32 s1, s2, s3, s4; | ||
| 36 | }; | ||
| 37 | |||
| 38 | u32 prandom_u32_state(struct rnd_state *state); | ||
| 34 | void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); | 39 | void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); |
| 35 | 40 | ||
| 36 | /* | 41 | /* |
| @@ -50,9 +55,10 @@ static inline void prandom_seed_state(struct rnd_state *state, u64 seed) | |||
| 50 | { | 55 | { |
| 51 | u32 i = (seed >> 32) ^ (seed << 10) ^ seed; | 56 | u32 i = (seed >> 32) ^ (seed << 10) ^ seed; |
| 52 | 57 | ||
| 53 | state->s1 = __seed(i, 1); | 58 | state->s1 = __seed(i, 2U); |
| 54 | state->s2 = __seed(i, 7); | 59 | state->s2 = __seed(i, 8U); |
| 55 | state->s3 = __seed(i, 15); | 60 | state->s3 = __seed(i, 16U); |
| 61 | state->s4 = __seed(i, 128U); | ||
| 56 | } | 62 | } |
| 57 | 63 | ||
| 58 | #ifdef CONFIG_ARCH_RANDOM | 64 | #ifdef CONFIG_ARCH_RANDOM |
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index f28544b2f9af..939428ad25ac 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -15,7 +15,7 @@ extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics); | |||
| 15 | extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, | 15 | extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, |
| 16 | u32 id, long expires, u32 error); | 16 | u32 id, long expires, u32 error); |
| 17 | 17 | ||
| 18 | extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change); | 18 | void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change, gfp_t flags); |
| 19 | 19 | ||
| 20 | /* RTNL is used as a global lock for all changes to network configuration */ | 20 | /* RTNL is used as a global lock for all changes to network configuration */ |
| 21 | extern void rtnl_lock(void); | 21 | extern void rtnl_lock(void); |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index c2d89335f637..215b5ea1cb30 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -318,9 +318,13 @@ enum { | |||
| 318 | 318 | ||
| 319 | SKB_GSO_GRE = 1 << 6, | 319 | SKB_GSO_GRE = 1 << 6, |
| 320 | 320 | ||
| 321 | SKB_GSO_UDP_TUNNEL = 1 << 7, | 321 | SKB_GSO_IPIP = 1 << 7, |
| 322 | 322 | ||
| 323 | SKB_GSO_MPLS = 1 << 8, | 323 | SKB_GSO_SIT = 1 << 8, |
| 324 | |||
| 325 | SKB_GSO_UDP_TUNNEL = 1 << 9, | ||
| 326 | |||
| 327 | SKB_GSO_MPLS = 1 << 10, | ||
| 324 | }; | 328 | }; |
| 325 | 329 | ||
| 326 | #if BITS_PER_LONG > 32 | 330 | #if BITS_PER_LONG > 32 |
| @@ -333,11 +337,6 @@ typedef unsigned int sk_buff_data_t; | |||
| 333 | typedef unsigned char *sk_buff_data_t; | 337 | typedef unsigned char *sk_buff_data_t; |
| 334 | #endif | 338 | #endif |
| 335 | 339 | ||
| 336 | #if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \ | ||
| 337 | defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE) | ||
| 338 | #define NET_SKBUFF_NF_DEFRAG_NEEDED 1 | ||
| 339 | #endif | ||
| 340 | |||
| 341 | /** | 340 | /** |
| 342 | * struct sk_buff - socket buffer | 341 | * struct sk_buff - socket buffer |
| 343 | * @next: Next buffer in list | 342 | * @next: Next buffer in list |
| @@ -370,7 +369,6 @@ typedef unsigned char *sk_buff_data_t; | |||
| 370 | * @protocol: Packet protocol from driver | 369 | * @protocol: Packet protocol from driver |
| 371 | * @destructor: Destruct function | 370 | * @destructor: Destruct function |
| 372 | * @nfct: Associated connection, if any | 371 | * @nfct: Associated connection, if any |
| 373 | * @nfct_reasm: netfilter conntrack re-assembly pointer | ||
| 374 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c | 372 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c |
| 375 | * @skb_iif: ifindex of device we arrived on | 373 | * @skb_iif: ifindex of device we arrived on |
| 376 | * @tc_index: Traffic control index | 374 | * @tc_index: Traffic control index |
| @@ -459,9 +457,6 @@ struct sk_buff { | |||
| 459 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 457 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
| 460 | struct nf_conntrack *nfct; | 458 | struct nf_conntrack *nfct; |
| 461 | #endif | 459 | #endif |
| 462 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
| 463 | struct sk_buff *nfct_reasm; | ||
| 464 | #endif | ||
| 465 | #ifdef CONFIG_BRIDGE_NETFILTER | 460 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 466 | struct nf_bridge_info *nf_bridge; | 461 | struct nf_bridge_info *nf_bridge; |
| 467 | #endif | 462 | #endif |
| @@ -585,8 +580,8 @@ static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | |||
| 585 | skb->_skb_refdst = (unsigned long)dst; | 580 | skb->_skb_refdst = (unsigned long)dst; |
| 586 | } | 581 | } |
| 587 | 582 | ||
| 588 | extern void __skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst, | 583 | void __skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst, |
| 589 | bool force); | 584 | bool force); |
| 590 | 585 | ||
| 591 | /** | 586 | /** |
| 592 | * skb_dst_set_noref - sets skb dst, hopefully, without taking reference | 587 | * skb_dst_set_noref - sets skb dst, hopefully, without taking reference |
| @@ -634,20 +629,20 @@ static inline struct rtable *skb_rtable(const struct sk_buff *skb) | |||
| 634 | return (struct rtable *)skb_dst(skb); | 629 | return (struct rtable *)skb_dst(skb); |
| 635 | } | 630 | } |
| 636 | 631 | ||
| 637 | extern void kfree_skb(struct sk_buff *skb); | 632 | void kfree_skb(struct sk_buff *skb); |
| 638 | extern void kfree_skb_list(struct sk_buff *segs); | 633 | void kfree_skb_list(struct sk_buff *segs); |
| 639 | extern void skb_tx_error(struct sk_buff *skb); | 634 | void skb_tx_error(struct sk_buff *skb); |
| 640 | extern void consume_skb(struct sk_buff *skb); | 635 | void consume_skb(struct sk_buff *skb); |
| 641 | extern void __kfree_skb(struct sk_buff *skb); | 636 | void __kfree_skb(struct sk_buff *skb); |
| 642 | extern struct kmem_cache *skbuff_head_cache; | 637 | extern struct kmem_cache *skbuff_head_cache; |
| 643 | 638 | ||
| 644 | extern void kfree_skb_partial(struct sk_buff *skb, bool head_stolen); | 639 | void kfree_skb_partial(struct sk_buff *skb, bool head_stolen); |
| 645 | extern bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, | 640 | bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, |
| 646 | bool *fragstolen, int *delta_truesize); | 641 | bool *fragstolen, int *delta_truesize); |
| 647 | 642 | ||
| 648 | extern struct sk_buff *__alloc_skb(unsigned int size, | 643 | struct sk_buff *__alloc_skb(unsigned int size, gfp_t priority, int flags, |
| 649 | gfp_t priority, int flags, int node); | 644 | int node); |
| 650 | extern struct sk_buff *build_skb(void *data, unsigned int frag_size); | 645 | struct sk_buff *build_skb(void *data, unsigned int frag_size); |
| 651 | static inline struct sk_buff *alloc_skb(unsigned int size, | 646 | static inline struct sk_buff *alloc_skb(unsigned int size, |
| 652 | gfp_t priority) | 647 | gfp_t priority) |
| 653 | { | 648 | { |
| @@ -660,41 +655,33 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size, | |||
| 660 | return __alloc_skb(size, priority, SKB_ALLOC_FCLONE, NUMA_NO_NODE); | 655 | return __alloc_skb(size, priority, SKB_ALLOC_FCLONE, NUMA_NO_NODE); |
| 661 | } | 656 | } |
| 662 | 657 | ||
| 663 | extern struct sk_buff *__alloc_skb_head(gfp_t priority, int node); | 658 | struct sk_buff *__alloc_skb_head(gfp_t priority, int node); |
| 664 | static inline struct sk_buff *alloc_skb_head(gfp_t priority) | 659 | static inline struct sk_buff *alloc_skb_head(gfp_t priority) |
| 665 | { | 660 | { |
| 666 | return __alloc_skb_head(priority, -1); | 661 | return __alloc_skb_head(priority, -1); |
| 667 | } | 662 | } |
| 668 | 663 | ||
| 669 | extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src); | 664 | struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src); |
| 670 | extern int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask); | 665 | int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask); |
| 671 | extern struct sk_buff *skb_clone(struct sk_buff *skb, | 666 | struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t priority); |
| 672 | gfp_t priority); | 667 | struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t priority); |
| 673 | extern struct sk_buff *skb_copy(const struct sk_buff *skb, | 668 | struct sk_buff *__pskb_copy(struct sk_buff *skb, int headroom, gfp_t gfp_mask); |
| 674 | gfp_t priority); | 669 | |
| 675 | extern struct sk_buff *__pskb_copy(struct sk_buff *skb, | 670 | int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, gfp_t gfp_mask); |
| 676 | int headroom, gfp_t gfp_mask); | 671 | struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, |
| 677 | 672 | unsigned int headroom); | |
| 678 | extern int pskb_expand_head(struct sk_buff *skb, | 673 | struct sk_buff *skb_copy_expand(const struct sk_buff *skb, int newheadroom, |
| 679 | int nhead, int ntail, | 674 | int newtailroom, gfp_t priority); |
| 680 | gfp_t gfp_mask); | 675 | int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, |
| 681 | extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, | 676 | int len); |
| 682 | unsigned int headroom); | 677 | int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer); |
| 683 | extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb, | 678 | int skb_pad(struct sk_buff *skb, int pad); |
| 684 | int newheadroom, int newtailroom, | ||
| 685 | gfp_t priority); | ||
| 686 | extern int skb_to_sgvec(struct sk_buff *skb, | ||
| 687 | struct scatterlist *sg, int offset, | ||
| 688 | int len); | ||
| 689 | extern int skb_cow_data(struct sk_buff *skb, int tailbits, | ||
| 690 | struct sk_buff **trailer); | ||
| 691 | extern int skb_pad(struct sk_buff *skb, int pad); | ||
| 692 | #define dev_kfree_skb(a) consume_skb(a) | 679 | #define dev_kfree_skb(a) consume_skb(a) |
| 693 | 680 | ||
| 694 | extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | 681 | int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, |
| 695 | int getfrag(void *from, char *to, int offset, | 682 | int getfrag(void *from, char *to, int offset, |
| 696 | int len,int odd, struct sk_buff *skb), | 683 | int len, int odd, struct sk_buff *skb), |
| 697 | void *from, int length); | 684 | void *from, int length); |
| 698 | 685 | ||
| 699 | struct skb_seq_state { | 686 | struct skb_seq_state { |
| 700 | __u32 lower_offset; | 687 | __u32 lower_offset; |
| @@ -706,18 +693,17 @@ struct skb_seq_state { | |||
| 706 | __u8 *frag_data; | 693 | __u8 *frag_data; |
| 707 | }; | 694 | }; |
| 708 | 695 | ||
| 709 | extern void skb_prepare_seq_read(struct sk_buff *skb, | 696 | void skb_prepare_seq_read(struct sk_buff *skb, unsigned int from, |
| 710 | unsigned int from, unsigned int to, | 697 | unsigned int to, struct skb_seq_state *st); |
| 711 | struct skb_seq_state *st); | 698 | unsigned int skb_seq_read(unsigned int consumed, const u8 **data, |
| 712 | extern unsigned int skb_seq_read(unsigned int consumed, const u8 **data, | 699 | struct skb_seq_state *st); |
| 713 | struct skb_seq_state *st); | 700 | void skb_abort_seq_read(struct skb_seq_state *st); |
| 714 | extern void skb_abort_seq_read(struct skb_seq_state *st); | ||
| 715 | 701 | ||
| 716 | extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, | 702 | unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, |
| 717 | unsigned int to, struct ts_config *config, | 703 | unsigned int to, struct ts_config *config, |
| 718 | struct ts_state *state); | 704 | struct ts_state *state); |
| 719 | 705 | ||
| 720 | extern void __skb_get_rxhash(struct sk_buff *skb); | 706 | void __skb_get_rxhash(struct sk_buff *skb); |
| 721 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) | 707 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) |
| 722 | { | 708 | { |
| 723 | if (!skb->l4_rxhash) | 709 | if (!skb->l4_rxhash) |
| @@ -1095,7 +1081,8 @@ static inline void skb_queue_head_init_class(struct sk_buff_head *list, | |||
| 1095 | * The "__skb_xxxx()" functions are the non-atomic ones that | 1081 | * The "__skb_xxxx()" functions are the non-atomic ones that |
| 1096 | * can only be called with interrupts disabled. | 1082 | * can only be called with interrupts disabled. |
| 1097 | */ | 1083 | */ |
| 1098 | extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list); | 1084 | void skb_insert(struct sk_buff *old, struct sk_buff *newsk, |
| 1085 | struct sk_buff_head *list); | ||
| 1099 | static inline void __skb_insert(struct sk_buff *newsk, | 1086 | static inline void __skb_insert(struct sk_buff *newsk, |
| 1100 | struct sk_buff *prev, struct sk_buff *next, | 1087 | struct sk_buff *prev, struct sk_buff *next, |
| 1101 | struct sk_buff_head *list) | 1088 | struct sk_buff_head *list) |
| @@ -1201,8 +1188,8 @@ static inline void __skb_queue_after(struct sk_buff_head *list, | |||
| 1201 | __skb_insert(newsk, prev, prev->next, list); | 1188 | __skb_insert(newsk, prev, prev->next, list); |
| 1202 | } | 1189 | } |
| 1203 | 1190 | ||
| 1204 | extern void skb_append(struct sk_buff *old, struct sk_buff *newsk, | 1191 | void skb_append(struct sk_buff *old, struct sk_buff *newsk, |
| 1205 | struct sk_buff_head *list); | 1192 | struct sk_buff_head *list); |
| 1206 | 1193 | ||
| 1207 | static inline void __skb_queue_before(struct sk_buff_head *list, | 1194 | static inline void __skb_queue_before(struct sk_buff_head *list, |
| 1208 | struct sk_buff *next, | 1195 | struct sk_buff *next, |
| @@ -1221,7 +1208,7 @@ static inline void __skb_queue_before(struct sk_buff_head *list, | |||
| 1221 | * | 1208 | * |
| 1222 | * A buffer cannot be placed on two lists at the same time. | 1209 | * A buffer cannot be placed on two lists at the same time. |
| 1223 | */ | 1210 | */ |
| 1224 | extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk); | 1211 | void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk); |
| 1225 | static inline void __skb_queue_head(struct sk_buff_head *list, | 1212 | static inline void __skb_queue_head(struct sk_buff_head *list, |
| 1226 | struct sk_buff *newsk) | 1213 | struct sk_buff *newsk) |
| 1227 | { | 1214 | { |
| @@ -1238,7 +1225,7 @@ static inline void __skb_queue_head(struct sk_buff_head *list, | |||
| 1238 | * | 1225 | * |
| 1239 | * A buffer cannot be placed on two lists at the same time. | 1226 | * A buffer cannot be placed on two lists at the same time. |
| 1240 | */ | 1227 | */ |
| 1241 | extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk); | 1228 | void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk); |
| 1242 | static inline void __skb_queue_tail(struct sk_buff_head *list, | 1229 | static inline void __skb_queue_tail(struct sk_buff_head *list, |
| 1243 | struct sk_buff *newsk) | 1230 | struct sk_buff *newsk) |
| 1244 | { | 1231 | { |
| @@ -1249,7 +1236,7 @@ static inline void __skb_queue_tail(struct sk_buff_head *list, | |||
| 1249 | * remove sk_buff from list. _Must_ be called atomically, and with | 1236 | * remove sk_buff from list. _Must_ be called atomically, and with |
| 1250 | * the list known.. | 1237 | * the list known.. |
| 1251 | */ | 1238 | */ |
| 1252 | extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list); | 1239 | void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list); |
| 1253 | static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) | 1240 | static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) |
| 1254 | { | 1241 | { |
| 1255 | struct sk_buff *next, *prev; | 1242 | struct sk_buff *next, *prev; |
| @@ -1270,7 +1257,7 @@ static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) | |||
| 1270 | * so must be used with appropriate locks held only. The head item is | 1257 | * so must be used with appropriate locks held only. The head item is |
| 1271 | * returned or %NULL if the list is empty. | 1258 | * returned or %NULL if the list is empty. |
| 1272 | */ | 1259 | */ |
| 1273 | extern struct sk_buff *skb_dequeue(struct sk_buff_head *list); | 1260 | struct sk_buff *skb_dequeue(struct sk_buff_head *list); |
| 1274 | static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list) | 1261 | static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list) |
| 1275 | { | 1262 | { |
| 1276 | struct sk_buff *skb = skb_peek(list); | 1263 | struct sk_buff *skb = skb_peek(list); |
| @@ -1287,7 +1274,7 @@ static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list) | |||
| 1287 | * so must be used with appropriate locks held only. The tail item is | 1274 | * so must be used with appropriate locks held only. The tail item is |
| 1288 | * returned or %NULL if the list is empty. | 1275 | * returned or %NULL if the list is empty. |
| 1289 | */ | 1276 | */ |
| 1290 | extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list); | 1277 | struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list); |
| 1291 | static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list) | 1278 | static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list) |
| 1292 | { | 1279 | { |
| 1293 | struct sk_buff *skb = skb_peek_tail(list); | 1280 | struct sk_buff *skb = skb_peek_tail(list); |
| @@ -1361,7 +1348,7 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i, | |||
| 1361 | * @size: the length of the data | 1348 | * @size: the length of the data |
| 1362 | * | 1349 | * |
| 1363 | * As per __skb_fill_page_desc() -- initialises the @i'th fragment of | 1350 | * As per __skb_fill_page_desc() -- initialises the @i'th fragment of |
| 1364 | * @skb to point to &size bytes at offset @off within @page. In | 1351 | * @skb to point to @size bytes at offset @off within @page. In |
| 1365 | * addition updates @skb such that @i is the last fragment. | 1352 | * addition updates @skb such that @i is the last fragment. |
| 1366 | * | 1353 | * |
| 1367 | * Does not take any additional reference on the fragment. | 1354 | * Does not take any additional reference on the fragment. |
| @@ -1373,8 +1360,11 @@ static inline void skb_fill_page_desc(struct sk_buff *skb, int i, | |||
| 1373 | skb_shinfo(skb)->nr_frags = i + 1; | 1360 | skb_shinfo(skb)->nr_frags = i + 1; |
| 1374 | } | 1361 | } |
| 1375 | 1362 | ||
| 1376 | extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | 1363 | void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off, |
| 1377 | int off, int size, unsigned int truesize); | 1364 | int size, unsigned int truesize); |
| 1365 | |||
| 1366 | void skb_coalesce_rx_frag(struct sk_buff *skb, int i, int size, | ||
| 1367 | unsigned int truesize); | ||
| 1378 | 1368 | ||
| 1379 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1369 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
| 1380 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb)) | 1370 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb)) |
| @@ -1418,7 +1408,8 @@ static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) | |||
| 1418 | /* | 1408 | /* |
| 1419 | * Add data to an sk_buff | 1409 | * Add data to an sk_buff |
| 1420 | */ | 1410 | */ |
| 1421 | extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len); | 1411 | unsigned char *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len); |
| 1412 | unsigned char *skb_put(struct sk_buff *skb, unsigned int len); | ||
| 1422 | static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) | 1413 | static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) |
| 1423 | { | 1414 | { |
| 1424 | unsigned char *tmp = skb_tail_pointer(skb); | 1415 | unsigned char *tmp = skb_tail_pointer(skb); |
| @@ -1428,7 +1419,7 @@ static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) | |||
| 1428 | return tmp; | 1419 | return tmp; |
| 1429 | } | 1420 | } |
| 1430 | 1421 | ||
| 1431 | extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len); | 1422 | unsigned char *skb_push(struct sk_buff *skb, unsigned int len); |
| 1432 | static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len) | 1423 | static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len) |
| 1433 | { | 1424 | { |
| 1434 | skb->data -= len; | 1425 | skb->data -= len; |
| @@ -1436,7 +1427,7 @@ static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len) | |||
| 1436 | return skb->data; | 1427 | return skb->data; |
| 1437 | } | 1428 | } |
| 1438 | 1429 | ||
| 1439 | extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len); | 1430 | unsigned char *skb_pull(struct sk_buff *skb, unsigned int len); |
| 1440 | static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) | 1431 | static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) |
| 1441 | { | 1432 | { |
| 1442 | skb->len -= len; | 1433 | skb->len -= len; |
| @@ -1449,7 +1440,7 @@ static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int l | |||
| 1449 | return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); | 1440 | return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); |
| 1450 | } | 1441 | } |
| 1451 | 1442 | ||
| 1452 | extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); | 1443 | unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); |
| 1453 | 1444 | ||
| 1454 | static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) | 1445 | static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) |
| 1455 | { | 1446 | { |
| @@ -1753,7 +1744,7 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) | |||
| 1753 | #define NET_SKB_PAD max(32, L1_CACHE_BYTES) | 1744 | #define NET_SKB_PAD max(32, L1_CACHE_BYTES) |
| 1754 | #endif | 1745 | #endif |
| 1755 | 1746 | ||
| 1756 | extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); | 1747 | int ___pskb_trim(struct sk_buff *skb, unsigned int len); |
| 1757 | 1748 | ||
| 1758 | static inline void __skb_trim(struct sk_buff *skb, unsigned int len) | 1749 | static inline void __skb_trim(struct sk_buff *skb, unsigned int len) |
| 1759 | { | 1750 | { |
| @@ -1765,7 +1756,7 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len) | |||
| 1765 | skb_set_tail_pointer(skb, len); | 1756 | skb_set_tail_pointer(skb, len); |
| 1766 | } | 1757 | } |
| 1767 | 1758 | ||
| 1768 | extern void skb_trim(struct sk_buff *skb, unsigned int len); | 1759 | void skb_trim(struct sk_buff *skb, unsigned int len); |
| 1769 | 1760 | ||
| 1770 | static inline int __pskb_trim(struct sk_buff *skb, unsigned int len) | 1761 | static inline int __pskb_trim(struct sk_buff *skb, unsigned int len) |
| 1771 | { | 1762 | { |
| @@ -1838,7 +1829,7 @@ static inline int skb_orphan_frags(struct sk_buff *skb, gfp_t gfp_mask) | |||
| 1838 | * the list and one reference dropped. This function does not take the | 1829 | * the list and one reference dropped. This function does not take the |
| 1839 | * list lock and the caller must hold the relevant locks to use it. | 1830 | * list lock and the caller must hold the relevant locks to use it. |
| 1840 | */ | 1831 | */ |
| 1841 | extern void skb_queue_purge(struct sk_buff_head *list); | 1832 | void skb_queue_purge(struct sk_buff_head *list); |
| 1842 | static inline void __skb_queue_purge(struct sk_buff_head *list) | 1833 | static inline void __skb_queue_purge(struct sk_buff_head *list) |
| 1843 | { | 1834 | { |
| 1844 | struct sk_buff *skb; | 1835 | struct sk_buff *skb; |
| @@ -1850,11 +1841,10 @@ static inline void __skb_queue_purge(struct sk_buff_head *list) | |||
| 1850 | #define NETDEV_FRAG_PAGE_MAX_SIZE (PAGE_SIZE << NETDEV_FRAG_PAGE_MAX_ORDER) | 1841 | #define NETDEV_FRAG_PAGE_MAX_SIZE (PAGE_SIZE << NETDEV_FRAG_PAGE_MAX_ORDER) |
| 1851 | #define NETDEV_PAGECNT_MAX_BIAS NETDEV_FRAG_PAGE_MAX_SIZE | 1842 | #define NETDEV_PAGECNT_MAX_BIAS NETDEV_FRAG_PAGE_MAX_SIZE |
| 1852 | 1843 | ||
| 1853 | extern void *netdev_alloc_frag(unsigned int fragsz); | 1844 | void *netdev_alloc_frag(unsigned int fragsz); |
| 1854 | 1845 | ||
| 1855 | extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, | 1846 | struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int length, |
| 1856 | unsigned int length, | 1847 | gfp_t gfp_mask); |
| 1857 | gfp_t gfp_mask); | ||
| 1858 | 1848 | ||
| 1859 | /** | 1849 | /** |
| 1860 | * netdev_alloc_skb - allocate an skbuff for rx on a specific device | 1850 | * netdev_alloc_skb - allocate an skbuff for rx on a specific device |
| @@ -2071,6 +2061,8 @@ static inline void skb_frag_set_page(struct sk_buff *skb, int f, | |||
| 2071 | __skb_frag_set_page(&skb_shinfo(skb)->frags[f], page); | 2061 | __skb_frag_set_page(&skb_shinfo(skb)->frags[f], page); |
| 2072 | } | 2062 | } |
| 2073 | 2063 | ||
| 2064 | bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio); | ||
| 2065 | |||
| 2074 | /** | 2066 | /** |
| 2075 | * skb_frag_dma_map - maps a paged fragment via the DMA API | 2067 | * skb_frag_dma_map - maps a paged fragment via the DMA API |
| 2076 | * @dev: the device to map the fragment to | 2068 | * @dev: the device to map the fragment to |
| @@ -2342,60 +2334,49 @@ static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag) | |||
| 2342 | #define skb_walk_frags(skb, iter) \ | 2334 | #define skb_walk_frags(skb, iter) \ |
| 2343 | for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next) | 2335 | for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next) |
| 2344 | 2336 | ||
| 2345 | extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, | 2337 | struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, |
| 2346 | int *peeked, int *off, int *err); | 2338 | int *peeked, int *off, int *err); |
| 2347 | extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, | 2339 | struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, |
| 2348 | int noblock, int *err); | 2340 | int *err); |
| 2349 | extern unsigned int datagram_poll(struct file *file, struct socket *sock, | 2341 | unsigned int datagram_poll(struct file *file, struct socket *sock, |
| 2350 | struct poll_table_struct *wait); | 2342 | struct poll_table_struct *wait); |
| 2351 | extern int skb_copy_datagram_iovec(const struct sk_buff *from, | 2343 | int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, |
| 2352 | int offset, struct iovec *to, | 2344 | struct iovec *to, int size); |
| 2353 | int size); | 2345 | int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, |
| 2354 | extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | 2346 | struct iovec *iov); |
| 2355 | int hlen, | 2347 | int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset, |
| 2356 | struct iovec *iov); | 2348 | const struct iovec *from, int from_offset, |
| 2357 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, | 2349 | int len); |
| 2358 | int offset, | 2350 | int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *frm, |
| 2359 | const struct iovec *from, | 2351 | int offset, size_t count); |
| 2360 | int from_offset, | 2352 | int skb_copy_datagram_const_iovec(const struct sk_buff *from, int offset, |
| 2361 | int len); | 2353 | const struct iovec *to, int to_offset, |
| 2362 | extern int zerocopy_sg_from_iovec(struct sk_buff *skb, | 2354 | int size); |
| 2363 | const struct iovec *frm, | 2355 | void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
| 2364 | int offset, | 2356 | void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); |
| 2365 | size_t count); | 2357 | int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags); |
| 2366 | extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, | 2358 | int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len); |
| 2367 | int offset, | 2359 | int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len); |
| 2368 | const struct iovec *to, | 2360 | __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to, |
| 2369 | int to_offset, | 2361 | int len, __wsum csum); |
| 2370 | int size); | 2362 | int skb_splice_bits(struct sk_buff *skb, unsigned int offset, |
| 2371 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | 2363 | struct pipe_inode_info *pipe, unsigned int len, |
| 2372 | extern void skb_free_datagram_locked(struct sock *sk, | 2364 | unsigned int flags); |
| 2373 | struct sk_buff *skb); | 2365 | void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to); |
| 2374 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, | 2366 | void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len); |
| 2375 | unsigned int flags); | 2367 | int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen); |
| 2376 | extern __wsum skb_checksum(const struct sk_buff *skb, int offset, | 2368 | void skb_scrub_packet(struct sk_buff *skb, bool xnet); |
| 2377 | int len, __wsum csum); | 2369 | struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features); |
| 2378 | extern int skb_copy_bits(const struct sk_buff *skb, int offset, | 2370 | |
| 2379 | void *to, int len); | 2371 | struct skb_checksum_ops { |
| 2380 | extern int skb_store_bits(struct sk_buff *skb, int offset, | 2372 | __wsum (*update)(const void *mem, int len, __wsum wsum); |
| 2381 | const void *from, int len); | 2373 | __wsum (*combine)(__wsum csum, __wsum csum2, int offset, int len); |
| 2382 | extern __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, | 2374 | }; |
| 2383 | int offset, u8 *to, int len, | 2375 | |
| 2384 | __wsum csum); | 2376 | __wsum __skb_checksum(const struct sk_buff *skb, int offset, int len, |
| 2385 | extern int skb_splice_bits(struct sk_buff *skb, | 2377 | __wsum csum, const struct skb_checksum_ops *ops); |
| 2386 | unsigned int offset, | 2378 | __wsum skb_checksum(const struct sk_buff *skb, int offset, int len, |
| 2387 | struct pipe_inode_info *pipe, | 2379 | __wsum csum); |
| 2388 | unsigned int len, | ||
| 2389 | unsigned int flags); | ||
| 2390 | extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to); | ||
| 2391 | extern void skb_split(struct sk_buff *skb, | ||
| 2392 | struct sk_buff *skb1, const u32 len); | ||
| 2393 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, | ||
| 2394 | int shiftlen); | ||
| 2395 | extern void skb_scrub_packet(struct sk_buff *skb, bool xnet); | ||
| 2396 | |||
| 2397 | extern struct sk_buff *skb_segment(struct sk_buff *skb, | ||
| 2398 | netdev_features_t features); | ||
| 2399 | 2380 | ||
| 2400 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 2381 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, |
| 2401 | int len, void *buffer) | 2382 | int len, void *buffer) |
| @@ -2440,7 +2421,7 @@ static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb, | |||
| 2440 | memcpy(skb->data + offset, from, len); | 2421 | memcpy(skb->data + offset, from, len); |
| 2441 | } | 2422 | } |
| 2442 | 2423 | ||
| 2443 | extern void skb_init(void); | 2424 | void skb_init(void); |
| 2444 | 2425 | ||
| 2445 | static inline ktime_t skb_get_ktime(const struct sk_buff *skb) | 2426 | static inline ktime_t skb_get_ktime(const struct sk_buff *skb) |
| 2446 | { | 2427 | { |
| @@ -2483,12 +2464,12 @@ static inline ktime_t net_invalid_timestamp(void) | |||
| 2483 | return ktime_set(0, 0); | 2464 | return ktime_set(0, 0); |
| 2484 | } | 2465 | } |
| 2485 | 2466 | ||
| 2486 | extern void skb_timestamping_init(void); | 2467 | void skb_timestamping_init(void); |
| 2487 | 2468 | ||
| 2488 | #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING | 2469 | #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING |
| 2489 | 2470 | ||
| 2490 | extern void skb_clone_tx_timestamp(struct sk_buff *skb); | 2471 | void skb_clone_tx_timestamp(struct sk_buff *skb); |
| 2491 | extern bool skb_defer_rx_timestamp(struct sk_buff *skb); | 2472 | bool skb_defer_rx_timestamp(struct sk_buff *skb); |
| 2492 | 2473 | ||
| 2493 | #else /* CONFIG_NETWORK_PHY_TIMESTAMPING */ | 2474 | #else /* CONFIG_NETWORK_PHY_TIMESTAMPING */ |
| 2494 | 2475 | ||
| @@ -2529,8 +2510,8 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, | |||
| 2529 | * generates a software time stamp (otherwise), then queues the clone | 2510 | * generates a software time stamp (otherwise), then queues the clone |
| 2530 | * to the error queue of the socket. Errors are silently ignored. | 2511 | * to the error queue of the socket. Errors are silently ignored. |
| 2531 | */ | 2512 | */ |
| 2532 | extern void skb_tstamp_tx(struct sk_buff *orig_skb, | 2513 | void skb_tstamp_tx(struct sk_buff *orig_skb, |
| 2533 | struct skb_shared_hwtstamps *hwtstamps); | 2514 | struct skb_shared_hwtstamps *hwtstamps); |
| 2534 | 2515 | ||
| 2535 | static inline void sw_tx_timestamp(struct sk_buff *skb) | 2516 | static inline void sw_tx_timestamp(struct sk_buff *skb) |
| 2536 | { | 2517 | { |
| @@ -2562,8 +2543,8 @@ static inline void skb_tx_timestamp(struct sk_buff *skb) | |||
| 2562 | */ | 2543 | */ |
| 2563 | void skb_complete_wifi_ack(struct sk_buff *skb, bool acked); | 2544 | void skb_complete_wifi_ack(struct sk_buff *skb, bool acked); |
| 2564 | 2545 | ||
| 2565 | extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); | 2546 | __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); |
| 2566 | extern __sum16 __skb_checksum_complete(struct sk_buff *skb); | 2547 | __sum16 __skb_checksum_complete(struct sk_buff *skb); |
| 2567 | 2548 | ||
| 2568 | static inline int skb_csum_unnecessary(const struct sk_buff *skb) | 2549 | static inline int skb_csum_unnecessary(const struct sk_buff *skb) |
| 2569 | { | 2550 | { |
| @@ -2593,7 +2574,7 @@ static inline __sum16 skb_checksum_complete(struct sk_buff *skb) | |||
| 2593 | } | 2574 | } |
| 2594 | 2575 | ||
| 2595 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 2576 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
| 2596 | extern void nf_conntrack_destroy(struct nf_conntrack *nfct); | 2577 | void nf_conntrack_destroy(struct nf_conntrack *nfct); |
| 2597 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) | 2578 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) |
| 2598 | { | 2579 | { |
| 2599 | if (nfct && atomic_dec_and_test(&nfct->use)) | 2580 | if (nfct && atomic_dec_and_test(&nfct->use)) |
| @@ -2605,18 +2586,6 @@ static inline void nf_conntrack_get(struct nf_conntrack *nfct) | |||
| 2605 | atomic_inc(&nfct->use); | 2586 | atomic_inc(&nfct->use); |
| 2606 | } | 2587 | } |
| 2607 | #endif | 2588 | #endif |
| 2608 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
| 2609 | static inline void nf_conntrack_get_reasm(struct sk_buff *skb) | ||
| 2610 | { | ||
| 2611 | if (skb) | ||
| 2612 | atomic_inc(&skb->users); | ||
| 2613 | } | ||
| 2614 | static inline void nf_conntrack_put_reasm(struct sk_buff *skb) | ||
| 2615 | { | ||
| 2616 | if (skb) | ||
| 2617 | kfree_skb(skb); | ||
| 2618 | } | ||
| 2619 | #endif | ||
| 2620 | #ifdef CONFIG_BRIDGE_NETFILTER | 2589 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 2621 | static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge) | 2590 | static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge) |
| 2622 | { | 2591 | { |
| @@ -2635,10 +2604,6 @@ static inline void nf_reset(struct sk_buff *skb) | |||
| 2635 | nf_conntrack_put(skb->nfct); | 2604 | nf_conntrack_put(skb->nfct); |
| 2636 | skb->nfct = NULL; | 2605 | skb->nfct = NULL; |
| 2637 | #endif | 2606 | #endif |
| 2638 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
| 2639 | nf_conntrack_put_reasm(skb->nfct_reasm); | ||
| 2640 | skb->nfct_reasm = NULL; | ||
| 2641 | #endif | ||
| 2642 | #ifdef CONFIG_BRIDGE_NETFILTER | 2607 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 2643 | nf_bridge_put(skb->nf_bridge); | 2608 | nf_bridge_put(skb->nf_bridge); |
| 2644 | skb->nf_bridge = NULL; | 2609 | skb->nf_bridge = NULL; |
| @@ -2660,10 +2625,6 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src) | |||
| 2660 | nf_conntrack_get(src->nfct); | 2625 | nf_conntrack_get(src->nfct); |
| 2661 | dst->nfctinfo = src->nfctinfo; | 2626 | dst->nfctinfo = src->nfctinfo; |
| 2662 | #endif | 2627 | #endif |
| 2663 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
| 2664 | dst->nfct_reasm = src->nfct_reasm; | ||
| 2665 | nf_conntrack_get_reasm(src->nfct_reasm); | ||
| 2666 | #endif | ||
| 2667 | #ifdef CONFIG_BRIDGE_NETFILTER | 2628 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 2668 | dst->nf_bridge = src->nf_bridge; | 2629 | dst->nf_bridge = src->nf_bridge; |
| 2669 | nf_bridge_get(src->nf_bridge); | 2630 | nf_bridge_get(src->nf_bridge); |
| @@ -2675,9 +2636,6 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src) | |||
| 2675 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 2636 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
| 2676 | nf_conntrack_put(dst->nfct); | 2637 | nf_conntrack_put(dst->nfct); |
| 2677 | #endif | 2638 | #endif |
| 2678 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
| 2679 | nf_conntrack_put_reasm(dst->nfct_reasm); | ||
| 2680 | #endif | ||
| 2681 | #ifdef CONFIG_BRIDGE_NETFILTER | 2639 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 2682 | nf_bridge_put(dst->nf_bridge); | 2640 | nf_bridge_put(dst->nf_bridge); |
| 2683 | #endif | 2641 | #endif |
| @@ -2732,28 +2690,27 @@ static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) | |||
| 2732 | return skb->queue_mapping != 0; | 2690 | return skb->queue_mapping != 0; |
| 2733 | } | 2691 | } |
| 2734 | 2692 | ||
| 2735 | extern u16 __skb_tx_hash(const struct net_device *dev, | 2693 | u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb, |
| 2736 | const struct sk_buff *skb, | 2694 | unsigned int num_tx_queues); |
| 2737 | unsigned int num_tx_queues); | ||
| 2738 | 2695 | ||
| 2739 | #ifdef CONFIG_XFRM | ||
| 2740 | static inline struct sec_path *skb_sec_path(struct sk_buff *skb) | 2696 | static inline struct sec_path *skb_sec_path(struct sk_buff *skb) |
| 2741 | { | 2697 | { |
| 2698 | #ifdef CONFIG_XFRM | ||
| 2742 | return skb->sp; | 2699 | return skb->sp; |
| 2743 | } | ||
| 2744 | #else | 2700 | #else |
| 2745 | static inline struct sec_path *skb_sec_path(struct sk_buff *skb) | ||
| 2746 | { | ||
| 2747 | return NULL; | 2701 | return NULL; |
| 2748 | } | ||
| 2749 | #endif | 2702 | #endif |
| 2703 | } | ||
| 2750 | 2704 | ||
| 2751 | /* Keeps track of mac header offset relative to skb->head. | 2705 | /* Keeps track of mac header offset relative to skb->head. |
| 2752 | * It is useful for TSO of Tunneling protocol. e.g. GRE. | 2706 | * It is useful for TSO of Tunneling protocol. e.g. GRE. |
| 2753 | * For non-tunnel skb it points to skb_mac_header() and for | 2707 | * For non-tunnel skb it points to skb_mac_header() and for |
| 2754 | * tunnel skb it points to outer mac header. */ | 2708 | * tunnel skb it points to outer mac header. |
| 2709 | * Keeps track of level of encapsulation of network headers. | ||
| 2710 | */ | ||
| 2755 | struct skb_gso_cb { | 2711 | struct skb_gso_cb { |
| 2756 | int mac_offset; | 2712 | int mac_offset; |
| 2713 | int encap_level; | ||
| 2757 | }; | 2714 | }; |
| 2758 | #define SKB_GSO_CB(skb) ((struct skb_gso_cb *)(skb)->cb) | 2715 | #define SKB_GSO_CB(skb) ((struct skb_gso_cb *)(skb)->cb) |
| 2759 | 2716 | ||
| @@ -2783,12 +2740,13 @@ static inline bool skb_is_gso(const struct sk_buff *skb) | |||
| 2783 | return skb_shinfo(skb)->gso_size; | 2740 | return skb_shinfo(skb)->gso_size; |
| 2784 | } | 2741 | } |
| 2785 | 2742 | ||
| 2743 | /* Note: Should be called only if skb_is_gso(skb) is true */ | ||
| 2786 | static inline bool skb_is_gso_v6(const struct sk_buff *skb) | 2744 | static inline bool skb_is_gso_v6(const struct sk_buff *skb) |
| 2787 | { | 2745 | { |
| 2788 | return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6; | 2746 | return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6; |
| 2789 | } | 2747 | } |
| 2790 | 2748 | ||
| 2791 | extern void __skb_warn_lro_forwarding(const struct sk_buff *skb); | 2749 | void __skb_warn_lro_forwarding(const struct sk_buff *skb); |
| 2792 | 2750 | ||
| 2793 | static inline bool skb_warn_if_lro(const struct sk_buff *skb) | 2751 | static inline bool skb_warn_if_lro(const struct sk_buff *skb) |
| 2794 | { | 2752 | { |
diff --git a/include/linux/ssb/ssb_driver_gige.h b/include/linux/ssb/ssb_driver_gige.h index 86a12b0cb239..0688472500bb 100644 --- a/include/linux/ssb/ssb_driver_gige.h +++ b/include/linux/ssb/ssb_driver_gige.h | |||
| @@ -108,6 +108,16 @@ static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) | |||
| 108 | return 0; | 108 | return 0; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | /* Get the device phy address */ | ||
| 112 | static inline int ssb_gige_get_phyaddr(struct pci_dev *pdev) | ||
| 113 | { | ||
| 114 | struct ssb_gige *dev = pdev_to_ssb_gige(pdev); | ||
| 115 | if (!dev) | ||
| 116 | return -ENODEV; | ||
| 117 | |||
| 118 | return dev->dev->bus->sprom.et0phyaddr; | ||
| 119 | } | ||
| 120 | |||
| 111 | extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, | 121 | extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, |
| 112 | struct pci_dev *pdev); | 122 | struct pci_dev *pdev); |
| 113 | extern int ssb_gige_map_irq(struct ssb_device *sdev, | 123 | extern int ssb_gige_map_irq(struct ssb_device *sdev, |
| @@ -174,6 +184,10 @@ static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) | |||
| 174 | { | 184 | { |
| 175 | return -ENODEV; | 185 | return -ENODEV; |
| 176 | } | 186 | } |
| 187 | static inline int ssb_gige_get_phyaddr(struct pci_dev *pdev) | ||
| 188 | { | ||
| 189 | return -ENODEV; | ||
| 190 | } | ||
| 177 | 191 | ||
| 178 | #endif /* CONFIG_SSB_DRIVER_GIGE */ | 192 | #endif /* CONFIG_SSB_DRIVER_GIGE */ |
| 179 | #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ | 193 | #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ |
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index cc25b70af33c..c3fa80745996 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h | |||
| @@ -36,6 +36,9 @@ | |||
| 36 | * SUCH DAMAGE. | 36 | * SUCH DAMAGE. |
| 37 | */ | 37 | */ |
| 38 | 38 | ||
| 39 | #ifndef __LINUX_USB_CDC_NCM_H | ||
| 40 | #define __LINUX_USB_CDC_NCM_H | ||
| 41 | |||
| 39 | #define CDC_NCM_COMM_ALTSETTING_NCM 0 | 42 | #define CDC_NCM_COMM_ALTSETTING_NCM 0 |
| 40 | #define CDC_NCM_COMM_ALTSETTING_MBIM 1 | 43 | #define CDC_NCM_COMM_ALTSETTING_MBIM 1 |
| 41 | 44 | ||
| @@ -85,22 +88,13 @@ | |||
| 85 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) | 88 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) |
| 86 | 89 | ||
| 87 | struct cdc_ncm_ctx { | 90 | struct cdc_ncm_ctx { |
| 88 | struct usb_cdc_ncm_ntb_parameters ncm_parm; | ||
| 89 | struct hrtimer tx_timer; | 91 | struct hrtimer tx_timer; |
| 90 | struct tasklet_struct bh; | 92 | struct tasklet_struct bh; |
| 91 | 93 | ||
| 92 | const struct usb_cdc_ncm_desc *func_desc; | 94 | const struct usb_cdc_ncm_desc *func_desc; |
| 93 | const struct usb_cdc_mbim_desc *mbim_desc; | 95 | const struct usb_cdc_mbim_desc *mbim_desc; |
| 94 | const struct usb_cdc_header_desc *header_desc; | ||
| 95 | const struct usb_cdc_union_desc *union_desc; | ||
| 96 | const struct usb_cdc_ether_desc *ether_desc; | 96 | const struct usb_cdc_ether_desc *ether_desc; |
| 97 | 97 | ||
| 98 | struct net_device *netdev; | ||
| 99 | struct usb_device *udev; | ||
| 100 | struct usb_host_endpoint *in_ep; | ||
| 101 | struct usb_host_endpoint *out_ep; | ||
| 102 | struct usb_host_endpoint *status_ep; | ||
| 103 | struct usb_interface *intf; | ||
| 104 | struct usb_interface *control; | 98 | struct usb_interface *control; |
| 105 | struct usb_interface *data; | 99 | struct usb_interface *data; |
| 106 | 100 | ||
| @@ -113,8 +107,6 @@ struct cdc_ncm_ctx { | |||
| 113 | 107 | ||
| 114 | u32 tx_timer_pending; | 108 | u32 tx_timer_pending; |
| 115 | u32 tx_curr_frame_num; | 109 | u32 tx_curr_frame_num; |
| 116 | u32 rx_speed; | ||
| 117 | u32 tx_speed; | ||
| 118 | u32 rx_max; | 110 | u32 rx_max; |
| 119 | u32 tx_max; | 111 | u32 tx_max; |
| 120 | u32 max_datagram_size; | 112 | u32 max_datagram_size; |
| @@ -127,9 +119,14 @@ struct cdc_ncm_ctx { | |||
| 127 | u16 connected; | 119 | u16 connected; |
| 128 | }; | 120 | }; |
| 129 | 121 | ||
| 130 | extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf); | 122 | u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf); |
| 131 | extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); | 123 | int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); |
| 132 | extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); | 124 | void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); |
| 133 | extern struct sk_buff *cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign); | 125 | struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign); |
| 134 | extern int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); | 126 | int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); |
| 135 | extern int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset); | 127 | int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset); |
| 128 | struct sk_buff * | ||
| 129 | cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags); | ||
| 130 | int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in); | ||
| 131 | |||
| 132 | #endif /* __LINUX_USB_CDC_NCM_H */ | ||
