Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.26
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.26: (1090 commits) [NET]: Fix and allocate less memory for ->priv'less netdevices [IPV6]: Fix dangling references on error in fib6_add(). [NETLABEL]: Fix NULL deref in netlbl_unlabel_staticlist_gen() if ifindex not found [PKT_SCHED]: Fix datalen check in tcf_simp_init(). [INET]: Uninline the __inet_inherit_port call. [INET]: Drop the inet_inherit_port() call. SCTP: Initialize partial_bytes_acked to 0, when all of the data is acked. [netdrvr] forcedeth: internal simplifications; changelog removal phylib: factor out get_phy_id from within get_phy_device PHY: add BCM5464 support to broadcom PHY driver cxgb3: Fix __must_check warning with dev_dbg. tc35815: Statistics cleanup natsemi: fix MMIO for PPC 44x platforms [TIPC]: Cleanup of TIPC reference table code [TIPC]: Optimized initialization of TIPC reference table [TIPC]: Remove inlining of reference table locking routines e1000: convert uint16_t style integers to u16 ixgb: convert uint16_t style integers to u16 sb1000.c: make const arrays static sb1000.c: stop inlining largish static functions ...
This commit is contained in:
@@ -231,7 +231,6 @@ unifdef-y += if_pppol2tp.h
|
||||
unifdef-y += if_pppox.h
|
||||
unifdef-y += if_tr.h
|
||||
unifdef-y += if_vlan.h
|
||||
unifdef-y += if_wanpipe.h
|
||||
unifdef-y += igmp.h
|
||||
unifdef-y += inet_diag.h
|
||||
unifdef-y += in.h
|
||||
@@ -261,6 +260,7 @@ unifdef-y += mempolicy.h
|
||||
unifdef-y += mii.h
|
||||
unifdef-y += mman.h
|
||||
unifdef-y += mroute.h
|
||||
unifdef-y += mroute6.h
|
||||
unifdef-y += msdos_fs.h
|
||||
unifdef-y += msg.h
|
||||
unifdef-y += nbd.h
|
||||
@@ -289,6 +289,7 @@ unifdef-y += parport.h
|
||||
unifdef-y += patchkey.h
|
||||
unifdef-y += pci.h
|
||||
unifdef-y += personality.h
|
||||
unifdef-y += pim.h
|
||||
unifdef-y += pktcdvd.h
|
||||
unifdef-y += pmu.h
|
||||
unifdef-y += poll.h
|
||||
|
||||
@@ -283,8 +283,8 @@ struct arcnet_local {
|
||||
int next_buf, first_free_buf;
|
||||
|
||||
/* network "reconfiguration" handling */
|
||||
time_t first_recon, /* time of "first" RECON message to count */
|
||||
last_recon; /* time of most recent RECON */
|
||||
unsigned long first_recon; /* time of "first" RECON message to count */
|
||||
unsigned long last_recon; /* time of most recent RECON */
|
||||
int num_recons; /* number of RECONs between first and last. */
|
||||
bool network_down; /* do we think the network is down? */
|
||||
|
||||
|
||||
@@ -85,8 +85,6 @@ static inline struct atalk_sock *at_sk(struct sock *sk)
|
||||
return (struct atalk_sock *)sk;
|
||||
}
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
struct ddpehdr {
|
||||
__be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */
|
||||
__be16 deh_sum;
|
||||
|
||||
+18
-17
@@ -37,21 +37,6 @@ struct sock_fprog /* Required for SO_ATTACH_FILTER. */
|
||||
struct sock_filter __user *filter;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct sk_filter
|
||||
{
|
||||
atomic_t refcnt;
|
||||
unsigned int len; /* Number of filter blocks */
|
||||
struct rcu_head rcu;
|
||||
struct sock_filter insns[0];
|
||||
};
|
||||
|
||||
static inline unsigned int sk_filter_len(struct sk_filter *fp)
|
||||
{
|
||||
return fp->len*sizeof(struct sock_filter) + sizeof(*fp);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Instruction classes
|
||||
*/
|
||||
@@ -136,15 +121,31 @@ static inline unsigned int sk_filter_len(struct sk_filter *fp)
|
||||
#define SKF_AD_PROTOCOL 0
|
||||
#define SKF_AD_PKTTYPE 4
|
||||
#define SKF_AD_IFINDEX 8
|
||||
#define SKF_AD_MAX 12
|
||||
#define SKF_AD_NLATTR 12
|
||||
#define SKF_AD_MAX 16
|
||||
#define SKF_NET_OFF (-0x100000)
|
||||
#define SKF_LL_OFF (-0x200000)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct sk_filter
|
||||
{
|
||||
atomic_t refcnt;
|
||||
unsigned int len; /* Number of filter blocks */
|
||||
struct rcu_head rcu;
|
||||
struct sock_filter insns[0];
|
||||
};
|
||||
|
||||
static inline unsigned int sk_filter_len(const struct sk_filter *fp)
|
||||
{
|
||||
return fp->len * sizeof(struct sock_filter) + sizeof(*fp);
|
||||
}
|
||||
|
||||
struct sk_buff;
|
||||
struct sock;
|
||||
|
||||
extern unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen);
|
||||
extern int sk_filter(struct sock *sk, struct sk_buff *skb);
|
||||
extern unsigned int sk_run_filter(struct sk_buff *skb,
|
||||
struct sock_filter *filter, int flen);
|
||||
extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
|
||||
extern int sk_detach_filter(struct sock *sk);
|
||||
extern int sk_chk_filter(struct sock_filter *filter, int flen);
|
||||
|
||||
@@ -50,7 +50,7 @@ struct gianfar_platform_data {
|
||||
u32 device_flags;
|
||||
/* board specific information */
|
||||
u32 board_flags;
|
||||
u32 bus_id;
|
||||
char bus_id[MII_BUS_ID_SIZE];
|
||||
u32 phy_id;
|
||||
u8 mac_addr[6];
|
||||
phy_interface_t interface;
|
||||
|
||||
+10
-1
@@ -176,12 +176,21 @@ extern void icmpv6_send(struct sk_buff *skb,
|
||||
__u32 info,
|
||||
struct net_device *dev);
|
||||
|
||||
extern int icmpv6_init(struct net_proto_family *ops);
|
||||
extern int icmpv6_init(void);
|
||||
extern int icmpv6_err_convert(int type, int code,
|
||||
int *err);
|
||||
extern void icmpv6_cleanup(void);
|
||||
extern void icmpv6_param_prob(struct sk_buff *skb,
|
||||
int code, int pos);
|
||||
|
||||
struct flowi;
|
||||
struct in6_addr;
|
||||
extern void icmpv6_flow_init(struct sock *sk,
|
||||
struct flowi *fl,
|
||||
u8 type,
|
||||
const struct in6_addr *saddr,
|
||||
const struct in6_addr *daddr,
|
||||
int oif);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
#define IEEE80211_MAX_FRAME_LEN 2352
|
||||
|
||||
#define IEEE80211_MAX_SSID_LEN 32
|
||||
#define IEEE80211_MAX_MESH_ID_LEN 32
|
||||
|
||||
struct ieee80211_hdr {
|
||||
__le16 frame_control;
|
||||
@@ -109,6 +110,16 @@ struct ieee80211_hdr {
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct ieee80211s_hdr {
|
||||
u8 flags;
|
||||
u8 ttl;
|
||||
u8 seqnum[3];
|
||||
u8 eaddr1[6];
|
||||
u8 eaddr2[6];
|
||||
u8 eaddr3[6];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct ieee80211_mgmt {
|
||||
__le16 frame_control;
|
||||
__le16 duration;
|
||||
@@ -206,6 +217,23 @@ struct ieee80211_mgmt {
|
||||
__le16 params;
|
||||
__le16 reason_code;
|
||||
} __attribute__((packed)) delba;
|
||||
struct{
|
||||
u8 action_code;
|
||||
/* capab_info for open and confirm,
|
||||
* reason for close
|
||||
*/
|
||||
__le16 aux;
|
||||
/* Followed in plink_confirm by status
|
||||
* code, AID and supported rates,
|
||||
* and directly by supported rates in
|
||||
* plink_open and plink_close
|
||||
*/
|
||||
u8 variable[0];
|
||||
} __attribute__((packed)) plink_action;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 variable[0];
|
||||
} __attribute__((packed)) mesh_action;
|
||||
} u;
|
||||
} __attribute__ ((packed)) action;
|
||||
} u;
|
||||
@@ -437,6 +465,13 @@ enum ieee80211_eid {
|
||||
WLAN_EID_TS_DELAY = 43,
|
||||
WLAN_EID_TCLAS_PROCESSING = 44,
|
||||
WLAN_EID_QOS_CAPA = 46,
|
||||
/* 802.11s */
|
||||
WLAN_EID_MESH_CONFIG = 36, /* Pending IEEE 802.11 ANA approval */
|
||||
WLAN_EID_MESH_ID = 37, /* Pending IEEE 802.11 ANA approval */
|
||||
WLAN_EID_PEER_LINK = 40, /* Pending IEEE 802.11 ANA approval */
|
||||
WLAN_EID_PREQ = 53, /* Pending IEEE 802.11 ANA approval */
|
||||
WLAN_EID_PREP = 54, /* Pending IEEE 802.11 ANA approval */
|
||||
WLAN_EID_PERR = 55, /* Pending IEEE 802.11 ANA approval */
|
||||
/* 802.11h */
|
||||
WLAN_EID_PWR_CONSTRAINT = 32,
|
||||
WLAN_EID_PWR_CAPABILITY = 33,
|
||||
|
||||
@@ -156,6 +156,12 @@ static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct arphdr *)skb_network_header(skb);
|
||||
}
|
||||
|
||||
static inline int arp_hdr_len(struct net_device *dev)
|
||||
{
|
||||
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */
|
||||
return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_IF_ARP_H */
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1)
|
||||
#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2)
|
||||
#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3)
|
||||
#define SIOCGETPRL (SIOCDEVPRIVATE + 4)
|
||||
#define SIOCADDPRL (SIOCDEVPRIVATE + 5)
|
||||
#define SIOCDELPRL (SIOCDEVPRIVATE + 6)
|
||||
#define SIOCCHGPRL (SIOCDEVPRIVATE + 7)
|
||||
|
||||
#define GRE_CSUM __constant_htons(0x8000)
|
||||
#define GRE_ROUTING __constant_htons(0x4000)
|
||||
@@ -17,9 +21,6 @@
|
||||
#define GRE_FLAGS __constant_htons(0x00F8)
|
||||
#define GRE_VERSION __constant_htons(0x0007)
|
||||
|
||||
/* i_flags values for SIT mode */
|
||||
#define SIT_ISATAP 0x0001
|
||||
|
||||
struct ip_tunnel_parm
|
||||
{
|
||||
char name[IFNAMSIZ];
|
||||
@@ -31,4 +32,19 @@ struct ip_tunnel_parm
|
||||
struct iphdr iph;
|
||||
};
|
||||
|
||||
/* SIT-mode i_flags */
|
||||
#define SIT_ISATAP 0x0001
|
||||
|
||||
struct ip_tunnel_prl {
|
||||
__be32 addr;
|
||||
__u16 flags;
|
||||
__u16 __reserved;
|
||||
__u32 datalen;
|
||||
__u32 __reserved2;
|
||||
void __user *data;
|
||||
};
|
||||
|
||||
/* PRL flags */
|
||||
#define PRL_DEFAULT 0x0001
|
||||
|
||||
#endif /* _IF_TUNNEL_H_ */
|
||||
|
||||
@@ -81,7 +81,9 @@ extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *));
|
||||
#define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS)
|
||||
|
||||
struct vlan_group {
|
||||
int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */
|
||||
struct net_device *real_dev; /* The ethernet(like) device
|
||||
* the vlan is attached to.
|
||||
*/
|
||||
unsigned int nr_vlans;
|
||||
struct hlist_node hlist; /* linked list */
|
||||
struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS];
|
||||
@@ -93,7 +95,7 @@ static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
|
||||
{
|
||||
struct net_device **array;
|
||||
array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
|
||||
return array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN];
|
||||
return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL;
|
||||
}
|
||||
|
||||
static inline void vlan_group_set_device(struct vlan_group *vg,
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
/*****************************************************************************
|
||||
* if_wanpipe.h Header file for the Sangoma AF_WANPIPE Socket
|
||||
*
|
||||
* Author: Nenad Corbic
|
||||
*
|
||||
* Copyright: (c) 2000 Sangoma Technologies Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
* ============================================================================
|
||||
*
|
||||
* Jan 28, 2000 Nenad Corbic Initial Version
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __LINUX_IF_WAN_PACKET_H
|
||||
#define __LINUX_IF_WAN_PACKET_H
|
||||
|
||||
struct wan_sockaddr_ll
|
||||
{
|
||||
unsigned short sll_family;
|
||||
unsigned short sll_protocol;
|
||||
int sll_ifindex;
|
||||
unsigned short sll_hatype;
|
||||
unsigned char sll_pkttype;
|
||||
unsigned char sll_halen;
|
||||
unsigned char sll_addr[8];
|
||||
unsigned char sll_device[14];
|
||||
unsigned char sll_card[14];
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char free;
|
||||
unsigned char state_sk;
|
||||
int rcvbuf;
|
||||
int sndbuf;
|
||||
int rmem;
|
||||
int wmem;
|
||||
int sk_count;
|
||||
unsigned char bound;
|
||||
char name[14];
|
||||
unsigned char d_state;
|
||||
unsigned char svc;
|
||||
unsigned short lcn;
|
||||
unsigned char mbox;
|
||||
unsigned char cmd_busy;
|
||||
unsigned char command;
|
||||
unsigned poll;
|
||||
unsigned poll_cnt;
|
||||
int rblock;
|
||||
} wan_debug_hdr_t;
|
||||
|
||||
#define MAX_NUM_DEBUG 10
|
||||
#define X25_PROT 0x16
|
||||
#define PVC_PROT 0x17
|
||||
|
||||
typedef struct
|
||||
{
|
||||
wan_debug_hdr_t debug[MAX_NUM_DEBUG];
|
||||
}wan_debug_t;
|
||||
|
||||
#define SIOC_WANPIPE_GET_CALL_DATA (SIOCPROTOPRIVATE + 0)
|
||||
#define SIOC_WANPIPE_SET_CALL_DATA (SIOCPROTOPRIVATE + 1)
|
||||
#define SIOC_WANPIPE_ACCEPT_CALL (SIOCPROTOPRIVATE + 2)
|
||||
#define SIOC_WANPIPE_CLEAR_CALL (SIOCPROTOPRIVATE + 3)
|
||||
#define SIOC_WANPIPE_RESET_CALL (SIOCPROTOPRIVATE + 4)
|
||||
#define SIOC_WANPIPE_DEBUG (SIOCPROTOPRIVATE + 5)
|
||||
#define SIOC_WANPIPE_SET_NONBLOCK (SIOCPROTOPRIVATE + 6)
|
||||
#define SIOC_WANPIPE_CHECK_TX (SIOCPROTOPRIVATE + 7)
|
||||
#define SIOC_WANPIPE_SOCK_STATE (SIOCPROTOPRIVATE + 8)
|
||||
|
||||
/* Packet types */
|
||||
|
||||
#define WAN_PACKET_HOST 0 /* To us */
|
||||
#define WAN_PACKET_BROADCAST 1 /* To all */
|
||||
#define WAN_PACKET_MULTICAST 2 /* To group */
|
||||
#define WAN_PACKET_OTHERHOST 3 /* To someone else */
|
||||
#define WAN_PACKET_OUTGOING 4 /* Outgoing of any type */
|
||||
/* These ones are invisible by user level */
|
||||
#define WAN_PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
|
||||
#define WAN_PACKET_FASTROUTE 6 /* Fastrouted frame */
|
||||
|
||||
|
||||
/* X25 specific */
|
||||
#define WAN_PACKET_DATA 7
|
||||
#define WAN_PACKET_CMD 8
|
||||
#define WAN_PACKET_ASYNC 9
|
||||
#define WAN_PACKET_ERR 10
|
||||
|
||||
/* Packet socket options */
|
||||
|
||||
#define WAN_PACKET_ADD_MEMBERSHIP 1
|
||||
#define WAN_PACKET_DROP_MEMBERSHIP 2
|
||||
|
||||
#define WAN_PACKET_MR_MULTICAST 0
|
||||
#define WAN_PACKET_MR_PROMISC 1
|
||||
#define WAN_PACKET_MR_ALLMULTI 2
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* Private wanpipe socket structures. */
|
||||
struct wanpipe_opt
|
||||
{
|
||||
void *mbox; /* Mail box */
|
||||
void *card; /* Card bouded to */
|
||||
struct net_device *dev; /* Bounded device */
|
||||
unsigned short lcn; /* Binded LCN */
|
||||
unsigned char svc; /* 0=pvc, 1=svc */
|
||||
unsigned char timer; /* flag for delayed transmit*/
|
||||
struct timer_list tx_timer;
|
||||
unsigned poll_cnt;
|
||||
unsigned char force; /* Used to force sock release */
|
||||
atomic_t packet_sent;
|
||||
unsigned short num;
|
||||
};
|
||||
|
||||
#define wp_sk(__sk) ((struct wanpipe_opt *)(__sk)->sk_protinfo)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+17
-21
@@ -80,27 +80,6 @@ struct igmpv3_query {
|
||||
__be32 srcs[0];
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmphdr *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
static inline struct igmpv3_report *
|
||||
igmpv3_report_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmpv3_report *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
static inline struct igmpv3_query *
|
||||
igmpv3_query_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmpv3_query *)skb_transport_header(skb);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */
|
||||
#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */
|
||||
#define IGMP_DVMRP 0x13 /* DVMRP routing */
|
||||
@@ -151,6 +130,23 @@ static inline struct igmpv3_query *
|
||||
#include <linux/timer.h>
|
||||
#include <linux/in.h>
|
||||
|
||||
static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmphdr *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
static inline struct igmpv3_report *
|
||||
igmpv3_report_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmpv3_report *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
static inline struct igmpv3_query *
|
||||
igmpv3_query_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct igmpv3_query *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
extern int sysctl_igmp_max_memberships;
|
||||
extern int sysctl_igmp_max_msf;
|
||||
|
||||
|
||||
@@ -48,6 +48,14 @@ extern const struct in6_addr in6addr_any;
|
||||
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
|
||||
extern const struct in6_addr in6addr_loopback;
|
||||
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
|
||||
#ifdef __KERNEL__
|
||||
extern const struct in6_addr in6addr_linklocal_allnodes;
|
||||
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
|
||||
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
|
||||
extern const struct in6_addr in6addr_linklocal_allrouters;
|
||||
#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
|
||||
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
|
||||
#endif
|
||||
|
||||
struct sockaddr_in6 {
|
||||
unsigned short int sin6_family; /* AF_INET6 */
|
||||
@@ -249,4 +257,30 @@ struct in6_flowlabel_req
|
||||
* IP6T_SO_GET_REVISION_TARGET 69
|
||||
*/
|
||||
|
||||
/* RFC5014: Source address selection */
|
||||
#define IPV6_ADDR_PREFERENCES 72
|
||||
|
||||
#define IPV6_PREFER_SRC_TMP 0x0001
|
||||
#define IPV6_PREFER_SRC_PUBLIC 0x0002
|
||||
#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
|
||||
#define IPV6_PREFER_SRC_COA 0x0004
|
||||
#define IPV6_PREFER_SRC_HOME 0x0400
|
||||
#define IPV6_PREFER_SRC_CGA 0x0008
|
||||
#define IPV6_PREFER_SRC_NONCGA 0x0800
|
||||
|
||||
/*
|
||||
* Multicast Routing:
|
||||
* see include/linux/mroute6.h.
|
||||
*
|
||||
* MRT6_INIT 200
|
||||
* MRT6_DONE 201
|
||||
* MRT6_ADD_MIF 202
|
||||
* MRT6_DEL_MIF 203
|
||||
* MRT6_ADD_MFC 204
|
||||
* MRT6_DEL_MFC 205
|
||||
* MRT6_VERSION 206
|
||||
* MRT6_ASSERT 207
|
||||
* MRT6_PIM 208
|
||||
* (reserved) 209
|
||||
*/
|
||||
#endif
|
||||
|
||||
@@ -70,13 +70,13 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)
|
||||
ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val))
|
||||
|
||||
#define IN_DEV_ANDCONF(in_dev, attr) \
|
||||
(IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) && \
|
||||
(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \
|
||||
IN_DEV_CONF_GET((in_dev), attr))
|
||||
#define IN_DEV_ORCONF(in_dev, attr) \
|
||||
(IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) || \
|
||||
(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) || \
|
||||
IN_DEV_CONF_GET((in_dev), attr))
|
||||
#define IN_DEV_MAXCONF(in_dev, attr) \
|
||||
(max(IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr), \
|
||||
(max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \
|
||||
IN_DEV_CONF_GET((in_dev), attr)))
|
||||
|
||||
#define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING)
|
||||
@@ -129,7 +129,7 @@ extern int unregister_inetaddr_notifier(struct notifier_block *nb);
|
||||
|
||||
extern struct net_device *ip_dev_find(struct net *net, __be32 addr);
|
||||
extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
|
||||
extern int devinet_ioctl(unsigned int cmd, void __user *);
|
||||
extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
|
||||
extern void devinet_init(void);
|
||||
extern struct in_device *inetdev_by_index(struct net *, int);
|
||||
extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
|
||||
|
||||
+38
-10
@@ -159,6 +159,9 @@ struct ipv6_devconf {
|
||||
__s32 accept_source_route;
|
||||
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
|
||||
__s32 optimistic_dad;
|
||||
#endif
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
__s32 mc_forwarding;
|
||||
#endif
|
||||
void *sysctl;
|
||||
};
|
||||
@@ -190,6 +193,7 @@ enum {
|
||||
DEVCONF_PROXY_NDP,
|
||||
DEVCONF_OPTIMISTIC_DAD,
|
||||
DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
DEVCONF_MC_FORWARDING,
|
||||
DEVCONF_MAX
|
||||
};
|
||||
|
||||
@@ -230,6 +234,7 @@ struct inet6_skb_parm {
|
||||
#endif
|
||||
|
||||
#define IP6SKB_XFRM_TRANSFORMED 1
|
||||
#define IP6SKB_FORWARDED 2
|
||||
};
|
||||
|
||||
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
|
||||
@@ -274,8 +279,29 @@ struct ipv6_pinfo {
|
||||
|
||||
__be32 flow_label;
|
||||
__u32 frag_size;
|
||||
__s16 hop_limit;
|
||||
__s16 mcast_hops;
|
||||
|
||||
/*
|
||||
* Packed in 16bits.
|
||||
* Omit one shift by by putting the signed field at MSB.
|
||||
*/
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
__s16 hop_limit:9;
|
||||
__u16 __unused_1:7;
|
||||
#else
|
||||
__u16 __unused_1:7;
|
||||
__s16 hop_limit:9;
|
||||
#endif
|
||||
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
/* Packed in 16bits. */
|
||||
__s16 mcast_hops:9;
|
||||
__u16 __unused_2:6,
|
||||
mc_loop:1;
|
||||
#else
|
||||
__u16 mc_loop:1,
|
||||
__unused_2:6;
|
||||
__s16 mcast_hops:9;
|
||||
#endif
|
||||
int mcast_oif;
|
||||
|
||||
/* pktoption flags */
|
||||
@@ -298,11 +324,14 @@ struct ipv6_pinfo {
|
||||
} rxopt;
|
||||
|
||||
/* sockopt flags */
|
||||
__u8 mc_loop:1,
|
||||
recverr:1,
|
||||
__u8 recverr:1,
|
||||
sndflow:1,
|
||||
pmtudisc:2,
|
||||
ipv6only:1;
|
||||
ipv6only:1,
|
||||
srcprefs:3; /* 001: prefer temporary address
|
||||
* 010: prefer public address
|
||||
* 100: prefer care-of address
|
||||
*/
|
||||
__u8 tclass;
|
||||
|
||||
__u32 dst_cookie;
|
||||
@@ -315,9 +344,8 @@ struct ipv6_pinfo {
|
||||
struct sk_buff *pktoptions;
|
||||
struct {
|
||||
struct ipv6_txoptions *opt;
|
||||
struct rt6_info *rt;
|
||||
int hop_limit;
|
||||
int tclass;
|
||||
u8 hop_limit;
|
||||
u8 tclass;
|
||||
} cork;
|
||||
};
|
||||
|
||||
@@ -458,7 +486,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
|
||||
#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
|
||||
|
||||
#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
((__sk)->sk_family == AF_INET6) && \
|
||||
ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \
|
||||
@@ -466,7 +494,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
|
||||
#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
(*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports)) && \
|
||||
((__sk)->sk_family == PF_INET6) && \
|
||||
(ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr))) && \
|
||||
|
||||
@@ -16,14 +16,8 @@
|
||||
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
#ifdef CONFIG_COBALT_MICRO_SERVER
|
||||
/* Save memory */
|
||||
#define ISDN_MAX_DRIVERS 2
|
||||
#define ISDN_MAX_CHANNELS 8
|
||||
#else
|
||||
#define ISDN_MAX_DRIVERS 32
|
||||
#define ISDN_MAX_CHANNELS 64
|
||||
#endif
|
||||
|
||||
/* New ioctl-codes */
|
||||
#define IIOCNETAIF _IO('I',1)
|
||||
|
||||
+4
-21
@@ -2,7 +2,11 @@
|
||||
#define __LINUX_MROUTE_H
|
||||
|
||||
#include <linux/sockios.h>
|
||||
#include <linux/types.h>
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/in.h>
|
||||
#endif
|
||||
#include <linux/pim.h>
|
||||
|
||||
/*
|
||||
* Based on the MROUTING 3.5 defines primarily to keep
|
||||
@@ -210,27 +214,6 @@ struct mfc_cache
|
||||
#define IGMPMSG_WHOLEPKT 3 /* For PIM Register processing */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define PIM_V1_VERSION __constant_htonl(0x10000000)
|
||||
#define PIM_V1_REGISTER 1
|
||||
|
||||
#define PIM_VERSION 2
|
||||
#define PIM_REGISTER 1
|
||||
|
||||
#define PIM_NULL_REGISTER __constant_htonl(0x40000000)
|
||||
|
||||
/* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */
|
||||
|
||||
struct pimreghdr
|
||||
{
|
||||
__u8 type;
|
||||
__u8 reserved;
|
||||
__be16 csum;
|
||||
__be32 flags;
|
||||
};
|
||||
|
||||
extern int pim_rcv_v1(struct sk_buff *);
|
||||
|
||||
struct rtmsg;
|
||||
extern int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait);
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
#ifndef __LINUX_MROUTE6_H
|
||||
#define __LINUX_MROUTE6_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sockios.h>
|
||||
|
||||
/*
|
||||
* Based on the MROUTING 3.5 defines primarily to keep
|
||||
* source compatibility with BSD.
|
||||
*
|
||||
* See the pim6sd code for the original history.
|
||||
*
|
||||
* Protocol Independent Multicast (PIM) data structures included
|
||||
* Carlos Picoto (cap@di.fc.ul.pt)
|
||||
*
|
||||
*/
|
||||
|
||||
#define MRT6_BASE 200
|
||||
#define MRT6_INIT (MRT6_BASE) /* Activate the kernel mroute code */
|
||||
#define MRT6_DONE (MRT6_BASE+1) /* Shutdown the kernel mroute */
|
||||
#define MRT6_ADD_MIF (MRT6_BASE+2) /* Add a virtual interface */
|
||||
#define MRT6_DEL_MIF (MRT6_BASE+3) /* Delete a virtual interface */
|
||||
#define MRT6_ADD_MFC (MRT6_BASE+4) /* Add a multicast forwarding entry */
|
||||
#define MRT6_DEL_MFC (MRT6_BASE+5) /* Delete a multicast forwarding entry */
|
||||
#define MRT6_VERSION (MRT6_BASE+6) /* Get the kernel multicast version */
|
||||
#define MRT6_ASSERT (MRT6_BASE+7) /* Activate PIM assert mode */
|
||||
#define MRT6_PIM (MRT6_BASE+8) /* enable PIM code */
|
||||
|
||||
#define SIOCGETMIFCNT_IN6 SIOCPROTOPRIVATE /* IP protocol privates */
|
||||
#define SIOCGETSGCNT_IN6 (SIOCPROTOPRIVATE+1)
|
||||
#define SIOCGETRPF (SIOCPROTOPRIVATE+2)
|
||||
|
||||
#define MAXMIFS 32
|
||||
typedef unsigned long mifbitmap_t; /* User mode code depends on this lot */
|
||||
typedef unsigned short mifi_t;
|
||||
#define ALL_MIFS ((mifi_t)(-1))
|
||||
|
||||
#ifndef IF_SETSIZE
|
||||
#define IF_SETSIZE 256
|
||||
#endif
|
||||
|
||||
typedef __u32 if_mask;
|
||||
#define NIFBITS (sizeof(if_mask) * 8) /* bits per mask */
|
||||
|
||||
#if !defined(__KERNEL__) && !defined(DIV_ROUND_UP)
|
||||
#define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y))
|
||||
#endif
|
||||
|
||||
typedef struct if_set {
|
||||
if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)];
|
||||
} if_set;
|
||||
|
||||
#define IF_SET(n, p) ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS)))
|
||||
#define IF_CLR(n, p) ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS)))
|
||||
#define IF_ISSET(n, p) ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS)))
|
||||
#define IF_COPY(f, t) bcopy(f, t, sizeof(*(f)))
|
||||
#define IF_ZERO(p) bzero(p, sizeof(*(p)))
|
||||
|
||||
/*
|
||||
* Passed by mrouted for an MRT_ADD_MIF - again we use the
|
||||
* mrouted 3.6 structures for compatibility
|
||||
*/
|
||||
|
||||
struct mif6ctl {
|
||||
mifi_t mif6c_mifi; /* Index of MIF */
|
||||
unsigned char mif6c_flags; /* MIFF_ flags */
|
||||
unsigned char vifc_threshold; /* ttl limit */
|
||||
u_short mif6c_pifi; /* the index of the physical IF */
|
||||
unsigned int vifc_rate_limit; /* Rate limiter values (NI) */
|
||||
};
|
||||
|
||||
#define MIFF_REGISTER 0x1 /* register vif */
|
||||
|
||||
/*
|
||||
* Cache manipulation structures for mrouted and PIMd
|
||||
*/
|
||||
|
||||
struct mf6cctl
|
||||
{
|
||||
struct sockaddr_in6 mf6cc_origin; /* Origin of mcast */
|
||||
struct sockaddr_in6 mf6cc_mcastgrp; /* Group in question */
|
||||
mifi_t mf6cc_parent; /* Where it arrived */
|
||||
struct if_set mf6cc_ifset; /* Where it is going */
|
||||
};
|
||||
|
||||
/*
|
||||
* Group count retrieval for pim6sd
|
||||
*/
|
||||
|
||||
struct sioc_sg_req6
|
||||
{
|
||||
struct sockaddr_in6 src;
|
||||
struct sockaddr_in6 grp;
|
||||
unsigned long pktcnt;
|
||||
unsigned long bytecnt;
|
||||
unsigned long wrong_if;
|
||||
};
|
||||
|
||||
/*
|
||||
* To get vif packet counts
|
||||
*/
|
||||
|
||||
struct sioc_mif_req6
|
||||
{
|
||||
mifi_t mifi; /* Which iface */
|
||||
unsigned long icount; /* In packets */
|
||||
unsigned long ocount; /* Out packets */
|
||||
unsigned long ibytes; /* In bytes */
|
||||
unsigned long obytes; /* Out bytes */
|
||||
};
|
||||
|
||||
/*
|
||||
* That's all usermode folks
|
||||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/skbuff.h> /* for struct sk_buff_head */
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
static inline int ip6_mroute_opt(int opt)
|
||||
{
|
||||
return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10);
|
||||
}
|
||||
#else
|
||||
static inline int ip6_mroute_opt(int opt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct sock;
|
||||
|
||||
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, int);
|
||||
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ip6_mr_input(struct sk_buff *skb);
|
||||
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
extern void ip6_mr_init(void);
|
||||
|
||||
struct mif_device
|
||||
{
|
||||
struct net_device *dev; /* Device we are using */
|
||||
unsigned long bytes_in,bytes_out;
|
||||
unsigned long pkt_in,pkt_out; /* Statistics */
|
||||
unsigned long rate_limit; /* Traffic shaping (NI) */
|
||||
unsigned char threshold; /* TTL threshold */
|
||||
unsigned short flags; /* Control flags */
|
||||
int link; /* Physical interface index */
|
||||
};
|
||||
|
||||
#define VIFF_STATIC 0x8000
|
||||
|
||||
struct mfc6_cache
|
||||
{
|
||||
struct mfc6_cache *next; /* Next entry on cache line */
|
||||
struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */
|
||||
struct in6_addr mf6c_origin; /* Source of packet */
|
||||
mifi_t mf6c_parent; /* Source interface */
|
||||
int mfc_flags; /* Flags on line */
|
||||
|
||||
union {
|
||||
struct {
|
||||
unsigned long expires;
|
||||
struct sk_buff_head unresolved; /* Unresolved buffers */
|
||||
} unres;
|
||||
struct {
|
||||
unsigned long last_assert;
|
||||
int minvif;
|
||||
int maxvif;
|
||||
unsigned long bytes;
|
||||
unsigned long pkt;
|
||||
unsigned long wrong_if;
|
||||
unsigned char ttls[MAXMIFS]; /* TTL thresholds */
|
||||
} res;
|
||||
} mfc_un;
|
||||
};
|
||||
|
||||
#define MFC_STATIC 1
|
||||
#define MFC_NOTIFY 2
|
||||
|
||||
#define MFC6_LINES 64
|
||||
|
||||
#define MFC6_HASH(a, g) (((__force u32)(a)->s6_addr32[0] ^ \
|
||||
(__force u32)(a)->s6_addr32[1] ^ \
|
||||
(__force u32)(a)->s6_addr32[2] ^ \
|
||||
(__force u32)(a)->s6_addr32[3] ^ \
|
||||
(__force u32)(g)->s6_addr32[0] ^ \
|
||||
(__force u32)(g)->s6_addr32[1] ^ \
|
||||
(__force u32)(g)->s6_addr32[2] ^ \
|
||||
(__force u32)(g)->s6_addr32[3]) % MFC6_LINES)
|
||||
|
||||
#define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct rtmsg;
|
||||
extern int ip6mr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait);
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
extern struct sock *mroute6_socket;
|
||||
extern int ip6mr_sk_done(struct sock *sk);
|
||||
#else
|
||||
#define mroute6_socket NULL
|
||||
static inline int ip6mr_sk_done(struct sock *sk) { return 0; }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Structure used to communicate from kernel to multicast router.
|
||||
* We'll overlay the structure onto an MLD header (not an IPv6 heder like igmpmsg{}
|
||||
* used for IPv4 implementation). This is because this structure will be passed via an
|
||||
* IPv6 raw socket, on wich an application will only receiver the payload i.e the data after
|
||||
* the IPv6 header and all the extension headers. (See section 3 of RFC 3542)
|
||||
*/
|
||||
|
||||
struct mrt6msg {
|
||||
#define MRT6MSG_NOCACHE 1
|
||||
#define MRT6MSG_WRONGMIF 2
|
||||
#define MRT6MSG_WHOLEPKT 3 /* used for use level encap */
|
||||
__u8 im6_mbz; /* must be zero */
|
||||
__u8 im6_msgtype; /* what type of message */
|
||||
__u16 im6_mif; /* mif rec'd on */
|
||||
__u32 im6_pad; /* padding for 64 bit arch */
|
||||
struct in6_addr im6_src, im6_dst;
|
||||
};
|
||||
|
||||
#endif
|
||||
+2
-1
@@ -19,6 +19,7 @@
|
||||
#define _LINUX_NET_H
|
||||
|
||||
#include <linux/wait.h>
|
||||
#include <linux/socket.h>
|
||||
#include <asm/socket.h>
|
||||
|
||||
struct poll_table_struct;
|
||||
@@ -26,7 +27,7 @@ struct pipe_inode_info;
|
||||
struct inode;
|
||||
struct net;
|
||||
|
||||
#define NPROTO 34 /* should be enough for now.. */
|
||||
#define NPROTO AF_MAX
|
||||
|
||||
#define SYS_SOCKET 1 /* sys_socket(2) */
|
||||
#define SYS_BIND 2 /* sys_bind(2) */
|
||||
|
||||
@@ -710,8 +710,10 @@ struct net_device
|
||||
void (*poll_controller)(struct net_device *dev);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
/* Network namespace this network device is inside */
|
||||
struct net *nd_net;
|
||||
#endif
|
||||
|
||||
/* bridge stuff */
|
||||
struct net_bridge_port *br_port;
|
||||
@@ -726,6 +728,10 @@ struct net_device
|
||||
/* rtnetlink link ops */
|
||||
const struct rtnl_link_ops *rtnl_link_ops;
|
||||
|
||||
/* for setting kernel sock attribute on TCP connection setup */
|
||||
#define GSO_MAX_SIZE 65536
|
||||
unsigned int gso_max_size;
|
||||
|
||||
/* The TX queue control structures */
|
||||
unsigned int egress_subqueue_count;
|
||||
struct net_device_subqueue egress_subqueue[1];
|
||||
@@ -735,6 +741,28 @@ struct net_device
|
||||
#define NETDEV_ALIGN 32
|
||||
#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1)
|
||||
|
||||
/*
|
||||
* Net namespace inlines
|
||||
*/
|
||||
static inline
|
||||
struct net *dev_net(const struct net_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return dev->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
void dev_net_set(struct net_device *dev, struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
release_net(dev->nd_net);
|
||||
dev->nd_net = hold_net(net);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* netdev_priv - access network device private data
|
||||
* @dev: network device
|
||||
@@ -811,7 +839,7 @@ static inline struct net_device *next_net_device(struct net_device *dev)
|
||||
struct list_head *lh;
|
||||
struct net *net;
|
||||
|
||||
net = dev->nd_net;
|
||||
net = dev_net(dev);
|
||||
lh = dev->dev_list.next;
|
||||
return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
|
||||
}
|
||||
@@ -1479,6 +1507,12 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
|
||||
unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
|
||||
}
|
||||
|
||||
static inline void netif_set_gso_max_size(struct net_device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
dev->gso_max_size = size;
|
||||
}
|
||||
|
||||
/* On bonding slaves other than the currently active slave, suppress
|
||||
* duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
|
||||
* ARP on active-backup slaves with arp_validate enabled.
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/list.h>
|
||||
#include <net/net_namespace.h>
|
||||
#endif
|
||||
#include <linux/compiler.h>
|
||||
|
||||
@@ -61,13 +63,21 @@ union nf_inet_addr {
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_NETFILTER
|
||||
|
||||
static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1,
|
||||
const union nf_inet_addr *a2)
|
||||
{
|
||||
return a1->all[0] == a2->all[0] &&
|
||||
a1->all[1] == a2->all[1] &&
|
||||
a1->all[2] == a2->all[2] &&
|
||||
a1->all[3] == a2->all[3];
|
||||
}
|
||||
|
||||
extern void netfilter_init(void);
|
||||
|
||||
/* Largest hook number + 1 */
|
||||
#define NF_MAX_HOOKS 8
|
||||
|
||||
struct sk_buff;
|
||||
struct net_device;
|
||||
|
||||
typedef unsigned int nf_hookfn(unsigned int hooknum,
|
||||
struct sk_buff *skb,
|
||||
@@ -224,6 +234,11 @@ struct nf_afinfo {
|
||||
unsigned short family;
|
||||
__sum16 (*checksum)(struct sk_buff *skb, unsigned int hook,
|
||||
unsigned int dataoff, u_int8_t protocol);
|
||||
__sum16 (*checksum_partial)(struct sk_buff *skb,
|
||||
unsigned int hook,
|
||||
unsigned int dataoff,
|
||||
unsigned int len,
|
||||
u_int8_t protocol);
|
||||
int (*route)(struct dst_entry **dst, struct flowi *fl);
|
||||
void (*saveroute)(const struct sk_buff *skb,
|
||||
struct nf_queue_entry *entry);
|
||||
@@ -253,6 +268,23 @@ nf_checksum(struct sk_buff *skb, unsigned int hook, unsigned int dataoff,
|
||||
return csum;
|
||||
}
|
||||
|
||||
static inline __sum16
|
||||
nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
|
||||
unsigned int dataoff, unsigned int len,
|
||||
u_int8_t protocol, unsigned short family)
|
||||
{
|
||||
const struct nf_afinfo *afinfo;
|
||||
__sum16 csum = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
afinfo = nf_get_afinfo(family);
|
||||
if (afinfo)
|
||||
csum = afinfo->checksum_partial(skb, hook, dataoff, len,
|
||||
protocol);
|
||||
rcu_read_unlock();
|
||||
return csum;
|
||||
}
|
||||
|
||||
extern int nf_register_afinfo(const struct nf_afinfo *afinfo);
|
||||
extern void nf_unregister_afinfo(const struct nf_afinfo *afinfo);
|
||||
|
||||
@@ -311,5 +343,56 @@ extern void (*nf_ct_destroy)(struct nf_conntrack *);
|
||||
static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {}
|
||||
#endif
|
||||
|
||||
static inline struct net *nf_pre_routing_net(const struct net_device *in,
|
||||
const struct net_device *out)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return in->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct net *nf_local_in_net(const struct net_device *in,
|
||||
const struct net_device *out)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return in->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct net *nf_forward_net(const struct net_device *in,
|
||||
const struct net_device *out)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
BUG_ON(in->nd_net != out->nd_net);
|
||||
return in->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct net *nf_local_out_net(const struct net_device *in,
|
||||
const struct net_device *out)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return out->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct net *nf_post_routing_net(const struct net_device *in,
|
||||
const struct net_device *out)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return out->nd_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /*__KERNEL__*/
|
||||
#endif /*__LINUX_NETFILTER_H*/
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef _NF_CONNTRACK_DCCP_H
|
||||
#define _NF_CONNTRACK_DCCP_H
|
||||
|
||||
/* Exposed to userspace over nfnetlink */
|
||||
enum ct_dccp_states {
|
||||
CT_DCCP_NONE,
|
||||
CT_DCCP_REQUEST,
|
||||
CT_DCCP_RESPOND,
|
||||
CT_DCCP_PARTOPEN,
|
||||
CT_DCCP_OPEN,
|
||||
CT_DCCP_CLOSEREQ,
|
||||
CT_DCCP_CLOSING,
|
||||
CT_DCCP_TIMEWAIT,
|
||||
CT_DCCP_IGNORE,
|
||||
CT_DCCP_INVALID,
|
||||
__CT_DCCP_MAX
|
||||
};
|
||||
#define CT_DCCP_MAX (__CT_DCCP_MAX - 1)
|
||||
|
||||
enum ct_dccp_roles {
|
||||
CT_DCCP_ROLE_CLIENT,
|
||||
CT_DCCP_ROLE_SERVER,
|
||||
__CT_DCCP_ROLE_MAX
|
||||
};
|
||||
#define CT_DCCP_ROLE_MAX (__CT_DCCP_ROLE_MAX - 1)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <net/netfilter/nf_conntrack_tuple.h>
|
||||
|
||||
struct nf_ct_dccp {
|
||||
u_int8_t role[IP_CT_DIR_MAX];
|
||||
u_int8_t state;
|
||||
u_int8_t last_pkt;
|
||||
u_int8_t last_dir;
|
||||
u_int64_t handshake_seq;
|
||||
};
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _NF_CONNTRACK_DCCP_H */
|
||||
@@ -5,37 +5,164 @@
|
||||
#define SIP_PORT 5060
|
||||
#define SIP_TIMEOUT 3600
|
||||
|
||||
enum sip_header_pos {
|
||||
POS_REG_REQ_URI,
|
||||
POS_REQ_URI,
|
||||
POS_FROM,
|
||||
POS_TO,
|
||||
POS_VIA,
|
||||
POS_CONTACT,
|
||||
POS_CONTENT,
|
||||
POS_MEDIA,
|
||||
POS_OWNER_IP4,
|
||||
POS_CONNECTION_IP4,
|
||||
POS_OWNER_IP6,
|
||||
POS_CONNECTION_IP6,
|
||||
POS_SDP_HEADER,
|
||||
struct nf_ct_sip_master {
|
||||
unsigned int register_cseq;
|
||||
};
|
||||
|
||||
enum sip_expectation_classes {
|
||||
SIP_EXPECT_SIGNALLING,
|
||||
SIP_EXPECT_AUDIO,
|
||||
SIP_EXPECT_VIDEO,
|
||||
__SIP_EXPECT_MAX
|
||||
};
|
||||
#define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
|
||||
|
||||
struct sdp_media_type {
|
||||
const char *name;
|
||||
unsigned int len;
|
||||
enum sip_expectation_classes class;
|
||||
};
|
||||
|
||||
#define SDP_MEDIA_TYPE(__name, __class) \
|
||||
{ \
|
||||
.name = (__name), \
|
||||
.len = sizeof(__name) - 1, \
|
||||
.class = (__class), \
|
||||
}
|
||||
|
||||
struct sip_handler {
|
||||
const char *method;
|
||||
unsigned int len;
|
||||
int (*request)(struct sk_buff *skb,
|
||||
const char **dptr, unsigned int *datalen,
|
||||
unsigned int cseq);
|
||||
int (*response)(struct sk_buff *skb,
|
||||
const char **dptr, unsigned int *datalen,
|
||||
unsigned int cseq, unsigned int code);
|
||||
};
|
||||
|
||||
#define SIP_HANDLER(__method, __request, __response) \
|
||||
{ \
|
||||
.method = (__method), \
|
||||
.len = sizeof(__method) - 1, \
|
||||
.request = (__request), \
|
||||
.response = (__response), \
|
||||
}
|
||||
|
||||
struct sip_header {
|
||||
const char *name;
|
||||
const char *cname;
|
||||
const char *search;
|
||||
unsigned int len;
|
||||
unsigned int clen;
|
||||
unsigned int slen;
|
||||
int (*match_len)(const struct nf_conn *ct,
|
||||
const char *dptr, const char *limit,
|
||||
int *shift);
|
||||
};
|
||||
|
||||
#define __SIP_HDR(__name, __cname, __search, __match) \
|
||||
{ \
|
||||
.name = (__name), \
|
||||
.len = sizeof(__name) - 1, \
|
||||
.cname = (__cname), \
|
||||
.clen = (__cname) ? sizeof(__cname) - 1 : 0, \
|
||||
.search = (__search), \
|
||||
.slen = (__search) ? sizeof(__search) - 1 : 0, \
|
||||
.match_len = (__match), \
|
||||
}
|
||||
|
||||
#define SIP_HDR(__name, __cname, __search, __match) \
|
||||
__SIP_HDR(__name, __cname, __search, __match)
|
||||
|
||||
#define SDP_HDR(__name, __search, __match) \
|
||||
__SIP_HDR(__name, NULL, __search, __match)
|
||||
|
||||
enum sip_header_types {
|
||||
SIP_HDR_CSEQ,
|
||||
SIP_HDR_FROM,
|
||||
SIP_HDR_TO,
|
||||
SIP_HDR_CONTACT,
|
||||
SIP_HDR_VIA,
|
||||
SIP_HDR_EXPIRES,
|
||||
SIP_HDR_CONTENT_LENGTH,
|
||||
};
|
||||
|
||||
enum sdp_header_types {
|
||||
SDP_HDR_UNSPEC,
|
||||
SDP_HDR_VERSION,
|
||||
SDP_HDR_OWNER_IP4,
|
||||
SDP_HDR_CONNECTION_IP4,
|
||||
SDP_HDR_OWNER_IP6,
|
||||
SDP_HDR_CONNECTION_IP6,
|
||||
SDP_HDR_MEDIA,
|
||||
};
|
||||
|
||||
extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
|
||||
enum ip_conntrack_info ctinfo,
|
||||
struct nf_conn *ct,
|
||||
const char **dptr);
|
||||
extern unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb,
|
||||
enum ip_conntrack_info ctinfo,
|
||||
struct nf_conntrack_expect *exp,
|
||||
const char *dptr);
|
||||
const char **dptr,
|
||||
unsigned int *datalen);
|
||||
extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
|
||||
const char **dptr,
|
||||
unsigned int *datalen,
|
||||
struct nf_conntrack_expect *exp,
|
||||
unsigned int matchoff,
|
||||
unsigned int matchlen);
|
||||
extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
|
||||
const char **dptr,
|
||||
unsigned int dataoff,
|
||||
unsigned int *datalen,
|
||||
enum sdp_header_types type,
|
||||
enum sdp_header_types term,
|
||||
const union nf_inet_addr *addr);
|
||||
extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
|
||||
const char **dptr,
|
||||
unsigned int *datalen,
|
||||
unsigned int matchoff,
|
||||
unsigned int matchlen,
|
||||
u_int16_t port);
|
||||
extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
|
||||
const char **dptr,
|
||||
unsigned int dataoff,
|
||||
unsigned int *datalen,
|
||||
const union nf_inet_addr *addr);
|
||||
extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
|
||||
const char **dptr,
|
||||
unsigned int *datalen,
|
||||
struct nf_conntrack_expect *rtp_exp,
|
||||
struct nf_conntrack_expect *rtcp_exp,
|
||||
unsigned int mediaoff,
|
||||
unsigned int medialen,
|
||||
union nf_inet_addr *rtp_addr);
|
||||
|
||||
extern int ct_sip_parse_request(const struct nf_conn *ct,
|
||||
const char *dptr, unsigned int datalen,
|
||||
unsigned int *matchoff, unsigned int *matchlen,
|
||||
union nf_inet_addr *addr, __be16 *port);
|
||||
extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
|
||||
unsigned int dataoff, unsigned int datalen,
|
||||
enum sip_header_types type,
|
||||
unsigned int *matchoff, unsigned int *matchlen);
|
||||
extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
|
||||
unsigned int *dataoff, unsigned int datalen,
|
||||
enum sip_header_types type, int *in_header,
|
||||
unsigned int *matchoff, unsigned int *matchlen,
|
||||
union nf_inet_addr *addr, __be16 *port);
|
||||
extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
|
||||
unsigned int dataoff, unsigned int datalen,
|
||||
const char *name,
|
||||
unsigned int *matchoff, unsigned int *matchlen,
|
||||
union nf_inet_addr *addr);
|
||||
extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
|
||||
unsigned int off, unsigned int datalen,
|
||||
const char *name,
|
||||
unsigned int *matchoff, unsigned int *matchen,
|
||||
unsigned int *val);
|
||||
|
||||
extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
|
||||
unsigned int dataoff, unsigned int datalen,
|
||||
enum sdp_header_types type,
|
||||
enum sdp_header_types term,
|
||||
unsigned int *matchoff, unsigned int *matchlen);
|
||||
|
||||
extern int ct_sip_get_info(const struct nf_conn *ct, const char *dptr,
|
||||
size_t dlen, unsigned int *matchoff,
|
||||
unsigned int *matchlen, enum sip_header_pos pos);
|
||||
extern int ct_sip_lnlen(const char *line, const char *limit);
|
||||
extern const char *ct_sip_search(const char *needle, const char *haystack,
|
||||
size_t needle_len, size_t haystack_len,
|
||||
int case_sensitive);
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __NF_CONNTRACK_SIP_H__ */
|
||||
|
||||
@@ -80,6 +80,7 @@ enum ctattr_l4proto {
|
||||
enum ctattr_protoinfo {
|
||||
CTA_PROTOINFO_UNSPEC,
|
||||
CTA_PROTOINFO_TCP,
|
||||
CTA_PROTOINFO_DCCP,
|
||||
__CTA_PROTOINFO_MAX
|
||||
};
|
||||
#define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1)
|
||||
@@ -95,6 +96,13 @@ enum ctattr_protoinfo_tcp {
|
||||
};
|
||||
#define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1)
|
||||
|
||||
enum ctattr_protoinfo_dccp {
|
||||
CTA_PROTOINFO_DCCP_UNSPEC,
|
||||
CTA_PROTOINFO_DCCP_STATE,
|
||||
__CTA_PROTOINFO_DCCP_MAX,
|
||||
};
|
||||
#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
|
||||
|
||||
enum ctattr_counters {
|
||||
CTA_COUNTERS_UNSPEC,
|
||||
CTA_COUNTERS_PACKETS, /* old 64bit counters */
|
||||
|
||||
@@ -430,13 +430,13 @@ extern int xt_compat_add_offset(int af, unsigned int offset, short delta);
|
||||
extern void xt_compat_flush_offsets(int af);
|
||||
extern short xt_compat_calc_jump(int af, unsigned int offset);
|
||||
|
||||
extern int xt_compat_match_offset(struct xt_match *match);
|
||||
extern int xt_compat_match_offset(const struct xt_match *match);
|
||||
extern int xt_compat_match_from_user(struct xt_entry_match *m,
|
||||
void **dstptr, unsigned int *size);
|
||||
extern int xt_compat_match_to_user(struct xt_entry_match *m,
|
||||
void __user **dstptr, unsigned int *size);
|
||||
|
||||
extern int xt_compat_target_offset(struct xt_target *target);
|
||||
extern int xt_compat_target_offset(const struct xt_target *target);
|
||||
extern void xt_compat_target_from_user(struct xt_entry_target *t,
|
||||
void **dstptr, unsigned int *size);
|
||||
extern int xt_compat_target_to_user(struct xt_entry_target *t,
|
||||
|
||||
@@ -37,68 +37,54 @@ struct xt_sctp_info {
|
||||
|
||||
#define SCTP_CHUNKMAP_SET(chunkmap, type) \
|
||||
do { \
|
||||
chunkmap[type / bytes(u_int32_t)] |= \
|
||||
(chunkmap)[type / bytes(u_int32_t)] |= \
|
||||
1 << (type % bytes(u_int32_t)); \
|
||||
} while (0)
|
||||
|
||||
#define SCTP_CHUNKMAP_CLEAR(chunkmap, type) \
|
||||
do { \
|
||||
chunkmap[type / bytes(u_int32_t)] &= \
|
||||
(chunkmap)[type / bytes(u_int32_t)] &= \
|
||||
~(1 << (type % bytes(u_int32_t))); \
|
||||
} while (0)
|
||||
|
||||
#define SCTP_CHUNKMAP_IS_SET(chunkmap, type) \
|
||||
({ \
|
||||
(chunkmap[type / bytes (u_int32_t)] & \
|
||||
((chunkmap)[type / bytes (u_int32_t)] & \
|
||||
(1 << (type % bytes (u_int32_t)))) ? 1: 0; \
|
||||
})
|
||||
|
||||
#define SCTP_CHUNKMAP_RESET(chunkmap) \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \
|
||||
chunkmap[i] = 0; \
|
||||
} while (0)
|
||||
#define SCTP_CHUNKMAP_RESET(chunkmap) \
|
||||
memset((chunkmap), 0, sizeof(chunkmap))
|
||||
|
||||
#define SCTP_CHUNKMAP_SET_ALL(chunkmap) \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \
|
||||
chunkmap[i] = ~0; \
|
||||
} while (0)
|
||||
#define SCTP_CHUNKMAP_SET_ALL(chunkmap) \
|
||||
memset((chunkmap), ~0U, sizeof(chunkmap))
|
||||
|
||||
#define SCTP_CHUNKMAP_COPY(destmap, srcmap) \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 0; i < ARRAY_SIZE(srcmap); i++) \
|
||||
destmap[i] = srcmap[i]; \
|
||||
} while (0)
|
||||
#define SCTP_CHUNKMAP_COPY(destmap, srcmap) \
|
||||
memcpy((destmap), (srcmap), sizeof(srcmap))
|
||||
|
||||
#define SCTP_CHUNKMAP_IS_CLEAR(chunkmap) \
|
||||
({ \
|
||||
int i; \
|
||||
int flag = 1; \
|
||||
for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \
|
||||
if (chunkmap[i]) { \
|
||||
flag = 0; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
flag; \
|
||||
})
|
||||
#define SCTP_CHUNKMAP_IS_CLEAR(chunkmap) \
|
||||
__sctp_chunkmap_is_clear((chunkmap), ARRAY_SIZE(chunkmap))
|
||||
static inline bool
|
||||
__sctp_chunkmap_is_clear(const u_int32_t *chunkmap, unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < n; ++i)
|
||||
if (chunkmap[i])
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
#define SCTP_CHUNKMAP_IS_ALL_SET(chunkmap) \
|
||||
({ \
|
||||
int i; \
|
||||
int flag = 1; \
|
||||
for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \
|
||||
if (chunkmap[i] != ~0) { \
|
||||
flag = 0; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
flag; \
|
||||
})
|
||||
#define SCTP_CHUNKMAP_IS_ALL_SET(chunkmap) \
|
||||
__sctp_chunkmap_is_all_set((chunkmap), ARRAY_SIZE(chunkmap))
|
||||
static inline bool
|
||||
__sctp_chunkmap_is_all_set(const u_int32_t *chunkmap, unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < n; ++i)
|
||||
if (chunkmap[i] != ~0U)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* _XT_SCTP_H_ */
|
||||
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
|
||||
#define ARPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
|
||||
#define ARPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
|
||||
#define arpt_target xt_target
|
||||
#define arpt_table xt_table
|
||||
|
||||
#define ARPT_DEV_ADDR_LEN_MAX 16
|
||||
|
||||
@@ -266,20 +264,15 @@ struct arpt_error
|
||||
.target.errorname = "ERROR", \
|
||||
}
|
||||
|
||||
#define arpt_register_target(tgt) \
|
||||
({ (tgt)->family = NF_ARP; \
|
||||
xt_register_target(tgt); })
|
||||
#define arpt_unregister_target(tgt) xt_unregister_target(tgt)
|
||||
|
||||
extern struct arpt_table *arpt_register_table(struct net *net,
|
||||
struct arpt_table *table,
|
||||
const struct arpt_replace *repl);
|
||||
extern void arpt_unregister_table(struct arpt_table *table);
|
||||
extern struct xt_table *arpt_register_table(struct net *net,
|
||||
struct xt_table *table,
|
||||
const struct arpt_replace *repl);
|
||||
extern void arpt_unregister_table(struct xt_table *table);
|
||||
extern unsigned int arpt_do_table(struct sk_buff *skb,
|
||||
unsigned int hook,
|
||||
const struct net_device *in,
|
||||
const struct net_device *out,
|
||||
struct arpt_table *table);
|
||||
struct xt_table *table);
|
||||
|
||||
#define ARPT_ALIGN(s) XT_ALIGN(s)
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef __LINUX_BRIDGE_EBT_NFLOG_H
|
||||
#define __LINUX_BRIDGE_EBT_NFLOG_H
|
||||
|
||||
#define EBT_NFLOG_MASK 0x0
|
||||
|
||||
#define EBT_NFLOG_PREFIX_SIZE 64
|
||||
#define EBT_NFLOG_WATCHER "nflog"
|
||||
|
||||
#define EBT_NFLOG_DEFAULT_GROUP 0x1
|
||||
#define EBT_NFLOG_DEFAULT_THRESHOLD 1
|
||||
|
||||
struct ebt_nflog_info {
|
||||
u_int32_t len;
|
||||
u_int16_t group;
|
||||
u_int16_t threshold;
|
||||
u_int16_t flags;
|
||||
u_int16_t pad;
|
||||
char prefix[EBT_NFLOG_PREFIX_SIZE];
|
||||
};
|
||||
|
||||
#endif /* __LINUX_BRIDGE_EBT_NFLOG_H */
|
||||
@@ -62,8 +62,6 @@ enum nf_ip_hook_priorities {
|
||||
NF_IP_PRI_FILTER = 0,
|
||||
NF_IP_PRI_NAT_SRC = 100,
|
||||
NF_IP_PRI_SELINUX_LAST = 225,
|
||||
NF_IP_PRI_CONNTRACK_HELPER = INT_MAX - 2,
|
||||
NF_IP_PRI_NAT_SEQ_ADJUST = INT_MAX - 1,
|
||||
NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
|
||||
NF_IP_PRI_LAST = INT_MAX,
|
||||
};
|
||||
|
||||
+200
-18
@@ -78,6 +78,18 @@
|
||||
* or, if no MAC address given, all stations, on the interface identified
|
||||
* by %NL80211_ATTR_IFINDEX.
|
||||
*
|
||||
* @NL80211_CMD_GET_MPATH: Get mesh path attributes for mesh path to
|
||||
* destination %NL80211_ATTR_MAC on the interface identified by
|
||||
* %NL80211_ATTR_IFINDEX.
|
||||
* @NL80211_CMD_SET_MPATH: Set mesh path attributes for mesh path to
|
||||
* destination %NL80211_ATTR_MAC on the interface identified by
|
||||
* %NL80211_ATTR_IFINDEX.
|
||||
* @NL80211_CMD_NEW_PATH: Add a mesh path with given attributes to the
|
||||
* the interface identified by %NL80211_ATTR_IFINDEX.
|
||||
* @NL80211_CMD_DEL_PATH: Remove a mesh path identified by %NL80211_ATTR_MAC
|
||||
* or, if no MAC address given, all mesh paths, on the interface identified
|
||||
* by %NL80211_ATTR_IFINDEX.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -112,6 +124,11 @@ enum nl80211_commands {
|
||||
|
||||
/* add commands here */
|
||||
|
||||
NL80211_CMD_GET_MPATH,
|
||||
NL80211_CMD_SET_MPATH,
|
||||
NL80211_CMD_NEW_MPATH,
|
||||
NL80211_CMD_DEL_MPATH,
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
__NL80211_CMD_AFTER_LAST,
|
||||
NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
|
||||
@@ -157,9 +174,23 @@ enum nl80211_commands {
|
||||
* restriction (at most %NL80211_MAX_SUPP_RATES).
|
||||
* @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station
|
||||
* to, or the AP interface the station was originally added to to.
|
||||
* @NL80211_ATTR_STA_STATS: statistics for a station, part of station info
|
||||
* @NL80211_ATTR_STA_INFO: information about a station, part of station info
|
||||
* given for %NL80211_CMD_GET_STATION, nested attribute containing
|
||||
* info as possible, see &enum nl80211_sta_stats.
|
||||
* info as possible, see &enum nl80211_sta_info.
|
||||
*
|
||||
* @NL80211_ATTR_WIPHY_BANDS: Information about an operating bands,
|
||||
* consisting of a nested array.
|
||||
*
|
||||
* @NL80211_ATTR_MESH_ID: mesh id (1-32 bytes).
|
||||
* @NL80211_ATTR_PLINK_ACTION: action to perform on the mesh peer link.
|
||||
* @NL80211_ATTR_MPATH_NEXT_HOP: MAC address of the next hop for a mesh path.
|
||||
* @NL80211_ATTR_MPATH_INFO: information about a mesh_path, part of mesh path
|
||||
* info given for %NL80211_CMD_GET_MPATH, nested attribute described at
|
||||
* &enum nl80211_mpath_info.
|
||||
*
|
||||
*
|
||||
* @NL80211_ATTR_MNTR_FLAGS: flags, nested element with NLA_FLAG attributes of
|
||||
* &enum nl80211_mntr_flags.
|
||||
*
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -193,10 +224,19 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_STA_LISTEN_INTERVAL,
|
||||
NL80211_ATTR_STA_SUPPORTED_RATES,
|
||||
NL80211_ATTR_STA_VLAN,
|
||||
NL80211_ATTR_STA_STATS,
|
||||
NL80211_ATTR_STA_INFO,
|
||||
|
||||
NL80211_ATTR_WIPHY_BANDS,
|
||||
|
||||
NL80211_ATTR_MNTR_FLAGS,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
NL80211_ATTR_MESH_ID,
|
||||
NL80211_ATTR_STA_PLINK_ACTION,
|
||||
NL80211_ATTR_MPATH_NEXT_HOP,
|
||||
NL80211_ATTR_MPATH_INFO,
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
@@ -213,6 +253,7 @@ enum nl80211_attrs {
|
||||
* @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points
|
||||
* @NL80211_IFTYPE_WDS: wireless distribution interface
|
||||
* @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
|
||||
* @NL80211_IFTYPE_MESH_POINT: mesh point
|
||||
* @NL80211_IFTYPE_MAX: highest interface type number currently defined
|
||||
* @__NL80211_IFTYPE_AFTER_LAST: internal use
|
||||
*
|
||||
@@ -228,6 +269,7 @@ enum nl80211_iftype {
|
||||
NL80211_IFTYPE_AP_VLAN,
|
||||
NL80211_IFTYPE_WDS,
|
||||
NL80211_IFTYPE_MONITOR,
|
||||
NL80211_IFTYPE_MESH_POINT,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_IFTYPE_AFTER_LAST,
|
||||
@@ -257,27 +299,167 @@ enum nl80211_sta_flags {
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sta_stats - station statistics
|
||||
* enum nl80211_sta_info - station information
|
||||
*
|
||||
* These attribute types are used with %NL80211_ATTR_STA_STATS
|
||||
* These attribute types are used with %NL80211_ATTR_STA_INFO
|
||||
* when getting information about a station.
|
||||
*
|
||||
* @__NL80211_STA_STAT_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_STA_STAT_INACTIVE_TIME: time since last activity (u32, msecs)
|
||||
* @NL80211_STA_STAT_RX_BYTES: total received bytes (u32, from this station)
|
||||
* @NL80211_STA_STAT_TX_BYTES: total transmitted bytes (u32, to this station)
|
||||
* @__NL80211_STA_STAT_AFTER_LAST: internal
|
||||
* @NL80211_STA_STAT_MAX: highest possible station stats attribute
|
||||
* @__NL80211_STA_INFO_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs)
|
||||
* @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station)
|
||||
* @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station)
|
||||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||
*/
|
||||
enum nl80211_sta_stats {
|
||||
__NL80211_STA_STAT_INVALID,
|
||||
NL80211_STA_STAT_INACTIVE_TIME,
|
||||
NL80211_STA_STAT_RX_BYTES,
|
||||
NL80211_STA_STAT_TX_BYTES,
|
||||
enum nl80211_sta_info {
|
||||
__NL80211_STA_INFO_INVALID,
|
||||
NL80211_STA_INFO_INACTIVE_TIME,
|
||||
NL80211_STA_INFO_RX_BYTES,
|
||||
NL80211_STA_INFO_TX_BYTES,
|
||||
NL80211_STA_INFO_LLID,
|
||||
NL80211_STA_INFO_PLID,
|
||||
NL80211_STA_INFO_PLINK_STATE,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_STA_STAT_AFTER_LAST,
|
||||
NL80211_STA_STAT_MAX = __NL80211_STA_STAT_AFTER_LAST - 1
|
||||
__NL80211_STA_INFO_AFTER_LAST,
|
||||
NL80211_STA_INFO_MAX = __NL80211_STA_INFO_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_mpath_flags - nl80211 mesh path flags
|
||||
*
|
||||
* @NL80211_MPATH_FLAG_ACTIVE: the mesh path is active
|
||||
* @NL80211_MPATH_FLAG_RESOLVING: the mesh path discovery process is running
|
||||
* @NL80211_MPATH_FLAG_DSN_VALID: the mesh path contains a valid DSN
|
||||
* @NL80211_MPATH_FLAG_FIXED: the mesh path has been manually set
|
||||
* @NL80211_MPATH_FLAG_RESOLVED: the mesh path discovery process succeeded
|
||||
*/
|
||||
enum nl80211_mpath_flags {
|
||||
NL80211_MPATH_FLAG_ACTIVE = 1<<0,
|
||||
NL80211_MPATH_FLAG_RESOLVING = 1<<1,
|
||||
NL80211_MPATH_FLAG_DSN_VALID = 1<<2,
|
||||
NL80211_MPATH_FLAG_FIXED = 1<<3,
|
||||
NL80211_MPATH_FLAG_RESOLVED = 1<<4,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_mpath_info - mesh path information
|
||||
*
|
||||
* These attribute types are used with %NL80211_ATTR_MPATH_INFO when getting
|
||||
* information about a mesh path.
|
||||
*
|
||||
* @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination
|
||||
* @NL80211_ATTR_MPATH_DSN: destination sequence number
|
||||
* @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path
|
||||
* @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now
|
||||
* @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in
|
||||
* &enum nl80211_mpath_flags;
|
||||
* @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
|
||||
* @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries
|
||||
*/
|
||||
enum nl80211_mpath_info {
|
||||
__NL80211_MPATH_INFO_INVALID,
|
||||
NL80211_MPATH_INFO_FRAME_QLEN,
|
||||
NL80211_MPATH_INFO_DSN,
|
||||
NL80211_MPATH_INFO_METRIC,
|
||||
NL80211_MPATH_INFO_EXPTIME,
|
||||
NL80211_MPATH_INFO_FLAGS,
|
||||
NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
|
||||
NL80211_MPATH_INFO_DISCOVERY_RETRIES,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_MPATH_INFO_AFTER_LAST,
|
||||
NL80211_MPATH_INFO_MAX = __NL80211_MPATH_INFO_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_band_attr - band attributes
|
||||
* @__NL80211_BAND_ATTR_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_BAND_ATTR_FREQS: supported frequencies in this band,
|
||||
* an array of nested frequency attributes
|
||||
* @NL80211_BAND_ATTR_RATES: supported bitrates in this band,
|
||||
* an array of nested bitrate attributes
|
||||
*/
|
||||
enum nl80211_band_attr {
|
||||
__NL80211_BAND_ATTR_INVALID,
|
||||
NL80211_BAND_ATTR_FREQS,
|
||||
NL80211_BAND_ATTR_RATES,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_BAND_ATTR_AFTER_LAST,
|
||||
NL80211_BAND_ATTR_MAX = __NL80211_BAND_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_frequency_attr - frequency attributes
|
||||
* @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
|
||||
* @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
|
||||
* regulatory domain.
|
||||
* @NL80211_FREQUENCY_ATTR_PASSIVE_SCAN: Only passive scanning is
|
||||
* permitted on this channel in current regulatory domain.
|
||||
* @NL80211_FREQUENCY_ATTR_NO_IBSS: IBSS networks are not permitted
|
||||
* on this channel in current regulatory domain.
|
||||
* @NL80211_FREQUENCY_ATTR_RADAR: Radar detection is mandatory
|
||||
* on this channel in current regulatory domain.
|
||||
*/
|
||||
enum nl80211_frequency_attr {
|
||||
__NL80211_FREQUENCY_ATTR_INVALID,
|
||||
NL80211_FREQUENCY_ATTR_FREQ,
|
||||
NL80211_FREQUENCY_ATTR_DISABLED,
|
||||
NL80211_FREQUENCY_ATTR_PASSIVE_SCAN,
|
||||
NL80211_FREQUENCY_ATTR_NO_IBSS,
|
||||
NL80211_FREQUENCY_ATTR_RADAR,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
|
||||
NL80211_FREQUENCY_ATTR_MAX = __NL80211_FREQUENCY_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_bitrate_attr - bitrate attributes
|
||||
* @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps
|
||||
* @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported
|
||||
* in 2.4 GHz band.
|
||||
*/
|
||||
enum nl80211_bitrate_attr {
|
||||
__NL80211_BITRATE_ATTR_INVALID,
|
||||
NL80211_BITRATE_ATTR_RATE,
|
||||
NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_BITRATE_ATTR_AFTER_LAST,
|
||||
NL80211_BITRATE_ATTR_MAX = __NL80211_BITRATE_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_mntr_flags - monitor configuration flags
|
||||
*
|
||||
* Monitor configuration flags.
|
||||
*
|
||||
* @__NL80211_MNTR_FLAG_INVALID: reserved
|
||||
*
|
||||
* @NL80211_MNTR_FLAG_FCSFAIL: pass frames with bad FCS
|
||||
* @NL80211_MNTR_FLAG_PLCPFAIL: pass frames with bad PLCP
|
||||
* @NL80211_MNTR_FLAG_CONTROL: pass control frames
|
||||
* @NL80211_MNTR_FLAG_OTHER_BSS: disable BSSID filtering
|
||||
* @NL80211_MNTR_FLAG_COOK_FRAMES: report frames after processing.
|
||||
* overrides all other flags.
|
||||
*
|
||||
* @__NL80211_MNTR_FLAG_AFTER_LAST: internal use
|
||||
* @NL80211_MNTR_FLAG_MAX: highest possible monitor flag
|
||||
*/
|
||||
enum nl80211_mntr_flags {
|
||||
__NL80211_MNTR_FLAG_INVALID,
|
||||
NL80211_MNTR_FLAG_FCSFAIL,
|
||||
NL80211_MNTR_FLAG_PLCPFAIL,
|
||||
NL80211_MNTR_FLAG_CONTROL,
|
||||
NL80211_MNTR_FLAG_OTHER_BSS,
|
||||
NL80211_MNTR_FLAG_COOK_FRAMES,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_MNTR_FLAG_AFTER_LAST,
|
||||
NL80211_MNTR_FLAG_MAX = __NL80211_MNTR_FLAG_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
#ifndef __LINUX_PCOUNTER_H
|
||||
#define __LINUX_PCOUNTER_H
|
||||
/*
|
||||
* Using a dynamic percpu 'int' variable has a cost :
|
||||
* 1) Extra dereference
|
||||
* Current per_cpu_ptr() implementation uses an array per 'percpu variable'.
|
||||
* 2) memory cost of NR_CPUS*(32+sizeof(void *)) instead of num_possible_cpus()*4
|
||||
*
|
||||
* This pcounter implementation is an abstraction to be able to use
|
||||
* either a static or a dynamic per cpu variable.
|
||||
* One dynamic per cpu variable gets a fast & cheap implementation, we can
|
||||
* change pcounter implementation too.
|
||||
*/
|
||||
struct pcounter {
|
||||
#ifdef CONFIG_SMP
|
||||
void (*add)(struct pcounter *self, int inc);
|
||||
int (*getval)(const struct pcounter *self, int cpu);
|
||||
int *per_cpu_values;
|
||||
#else
|
||||
int val;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#define DEFINE_PCOUNTER(NAME) \
|
||||
static DEFINE_PER_CPU(int, NAME##_pcounter_values); \
|
||||
static void NAME##_pcounter_add(struct pcounter *self, int val) \
|
||||
{ \
|
||||
__get_cpu_var(NAME##_pcounter_values) += val; \
|
||||
} \
|
||||
static int NAME##_pcounter_getval(const struct pcounter *self, int cpu) \
|
||||
{ \
|
||||
return per_cpu(NAME##_pcounter_values, cpu); \
|
||||
} \
|
||||
|
||||
#define PCOUNTER_MEMBER_INITIALIZER(NAME, MEMBER) \
|
||||
MEMBER = { \
|
||||
.add = NAME##_pcounter_add, \
|
||||
.getval = NAME##_pcounter_getval, \
|
||||
}
|
||||
|
||||
|
||||
static inline void pcounter_add(struct pcounter *self, int inc)
|
||||
{
|
||||
self->add(self, inc);
|
||||
}
|
||||
|
||||
extern int pcounter_getval(const struct pcounter *self);
|
||||
extern int pcounter_alloc(struct pcounter *self);
|
||||
extern void pcounter_free(struct pcounter *self);
|
||||
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
static inline void pcounter_add(struct pcounter *self, int inc)
|
||||
{
|
||||
self->val += inc;
|
||||
}
|
||||
|
||||
static inline int pcounter_getval(const struct pcounter *self)
|
||||
{
|
||||
return self->val;
|
||||
}
|
||||
|
||||
#define DEFINE_PCOUNTER(NAME)
|
||||
#define PCOUNTER_MEMBER_INITIALIZER(NAME, MEMBER)
|
||||
#define pcounter_alloc(self) 0
|
||||
#define pcounter_free(self)
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#endif /* __LINUX_PCOUNTER_H */
|
||||
+41
-20
@@ -39,7 +39,8 @@
|
||||
SUPPORTED_1000baseT_Half | \
|
||||
SUPPORTED_1000baseT_Full)
|
||||
|
||||
/* Set phydev->irq to PHY_POLL if interrupts are not supported,
|
||||
/*
|
||||
* Set phydev->irq to PHY_POLL if interrupts are not supported,
|
||||
* or not desired for this PHY. Set to PHY_IGNORE_INTERRUPT if
|
||||
* the attached driver handles the interrupt
|
||||
*/
|
||||
@@ -63,8 +64,6 @@ typedef enum {
|
||||
PHY_INTERFACE_MODE_RTBI
|
||||
} phy_interface_t;
|
||||
|
||||
#define MII_BUS_MAX 4
|
||||
|
||||
|
||||
#define PHY_INIT_TIMEOUT 100000
|
||||
#define PHY_STATE_TIME 1
|
||||
@@ -74,20 +73,30 @@ typedef enum {
|
||||
#define PHY_MAX_ADDR 32
|
||||
|
||||
/* Used when trying to connect to a specific phy (mii bus id:phy device id) */
|
||||
#define PHY_ID_FMT "%x:%02x"
|
||||
#define PHY_ID_FMT "%s:%02x"
|
||||
|
||||
/* The Bus class for PHYs. Devices which provide access to
|
||||
* PHYs should register using this structure */
|
||||
/*
|
||||
* Need to be a little smaller than phydev->dev.bus_id to leave room
|
||||
* for the ":%02x"
|
||||
*/
|
||||
#define MII_BUS_ID_SIZE (BUS_ID_SIZE - 3)
|
||||
|
||||
/*
|
||||
* The Bus class for PHYs. Devices which provide access to
|
||||
* PHYs should register using this structure
|
||||
*/
|
||||
struct mii_bus {
|
||||
const char *name;
|
||||
int id;
|
||||
char id[MII_BUS_ID_SIZE];
|
||||
void *priv;
|
||||
int (*read)(struct mii_bus *bus, int phy_id, int regnum);
|
||||
int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val);
|
||||
int (*reset)(struct mii_bus *bus);
|
||||
|
||||
/* A lock to ensure that only one thing can read/write
|
||||
* the MDIO bus at a time */
|
||||
/*
|
||||
* A lock to ensure that only one thing can read/write
|
||||
* the MDIO bus at a time
|
||||
*/
|
||||
struct mutex mdio_lock;
|
||||
|
||||
struct device *dev;
|
||||
@@ -98,8 +107,10 @@ struct mii_bus {
|
||||
/* Phy addresses to be ignored when probing */
|
||||
u32 phy_mask;
|
||||
|
||||
/* Pointer to an array of interrupts, each PHY's
|
||||
* interrupt at the index matching its address */
|
||||
/*
|
||||
* Pointer to an array of interrupts, each PHY's
|
||||
* interrupt at the index matching its address
|
||||
*/
|
||||
int *irq;
|
||||
};
|
||||
|
||||
@@ -251,7 +262,8 @@ struct phy_device {
|
||||
/* Bus address of the PHY (0-32) */
|
||||
int addr;
|
||||
|
||||
/* forced speed & duplex (no autoneg)
|
||||
/*
|
||||
* forced speed & duplex (no autoneg)
|
||||
* partner speed & duplex & pause (autoneg)
|
||||
*/
|
||||
int speed;
|
||||
@@ -274,8 +286,10 @@ struct phy_device {
|
||||
|
||||
int link_timeout;
|
||||
|
||||
/* Interrupt number for this PHY
|
||||
* -1 means no interrupt */
|
||||
/*
|
||||
* Interrupt number for this PHY
|
||||
* -1 means no interrupt
|
||||
*/
|
||||
int irq;
|
||||
|
||||
/* private data pointer */
|
||||
@@ -325,22 +339,28 @@ struct phy_driver {
|
||||
u32 features;
|
||||
u32 flags;
|
||||
|
||||
/* Called to initialize the PHY,
|
||||
* including after a reset */
|
||||
/*
|
||||
* Called to initialize the PHY,
|
||||
* including after a reset
|
||||
*/
|
||||
int (*config_init)(struct phy_device *phydev);
|
||||
|
||||
/* Called during discovery. Used to set
|
||||
* up device-specific structures, if any */
|
||||
/*
|
||||
* Called during discovery. Used to set
|
||||
* up device-specific structures, if any
|
||||
*/
|
||||
int (*probe)(struct phy_device *phydev);
|
||||
|
||||
/* PHY Power Management */
|
||||
int (*suspend)(struct phy_device *phydev);
|
||||
int (*resume)(struct phy_device *phydev);
|
||||
|
||||
/* Configures the advertisement and resets
|
||||
/*
|
||||
* Configures the advertisement and resets
|
||||
* autonegotiation if phydev->autoneg is on,
|
||||
* forces the speed to the current settings in phydev
|
||||
* if phydev->autoneg is off */
|
||||
* if phydev->autoneg is off
|
||||
*/
|
||||
int (*config_aneg)(struct phy_device *phydev);
|
||||
|
||||
/* Determines the negotiated speed and duplex */
|
||||
@@ -361,6 +381,7 @@ struct phy_driver {
|
||||
|
||||
int phy_read(struct phy_device *phydev, u16 regnum);
|
||||
int phy_write(struct phy_device *phydev, u16 regnum, u16 val);
|
||||
int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id);
|
||||
struct phy_device* get_phy_device(struct mii_bus *bus, int addr);
|
||||
int phy_clear_interrupt(struct phy_device *phydev);
|
||||
int phy_config_interrupt(struct phy_device *phydev, u32 interrupts);
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
#ifndef __LINUX_PIM_H
|
||||
#define __LINUX_PIM_H
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#ifndef __KERNEL__
|
||||
struct pim {
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
__u8 pim_type:4, /* PIM message type */
|
||||
pim_ver:4; /* PIM version */
|
||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
||||
__u8 pim_ver:4; /* PIM version */
|
||||
pim_type:4; /* PIM message type */
|
||||
#endif
|
||||
__u8 pim_rsv; /* Reserved */
|
||||
__be16 pim_cksum; /* Checksum */
|
||||
};
|
||||
|
||||
#define PIM_MINLEN 8
|
||||
#endif
|
||||
|
||||
/* Message types - V1 */
|
||||
#define PIM_V1_VERSION __constant_htonl(0x10000000)
|
||||
#define PIM_V1_REGISTER 1
|
||||
|
||||
/* Message types - V2 */
|
||||
#define PIM_VERSION 2
|
||||
#define PIM_REGISTER 1
|
||||
|
||||
#if defined(__KERNEL__)
|
||||
#define PIM_NULL_REGISTER __constant_htonl(0x40000000)
|
||||
|
||||
/* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */
|
||||
struct pimreghdr
|
||||
{
|
||||
__u8 type;
|
||||
__u8 reserved;
|
||||
__be16 csum;
|
||||
__be32 flags;
|
||||
};
|
||||
|
||||
struct sk_buff;
|
||||
extern int pim_rcv_v1(struct sk_buff *);
|
||||
#endif
|
||||
#endif
|
||||
+24
-24
@@ -910,24 +910,24 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
||||
* Security hooks for XFRM operations.
|
||||
*
|
||||
* @xfrm_policy_alloc_security:
|
||||
* @xp contains the xfrm_policy being added to Security Policy Database
|
||||
* used by the XFRM system.
|
||||
* @ctxp is a pointer to the xfrm_sec_ctx being added to Security Policy
|
||||
* Database used by the XFRM system.
|
||||
* @sec_ctx contains the security context information being provided by
|
||||
* the user-level policy update program (e.g., setkey).
|
||||
* Allocate a security structure to the xp->security field; the security
|
||||
* field is initialized to NULL when the xfrm_policy is allocated.
|
||||
* Return 0 if operation was successful (memory to allocate, legal context)
|
||||
* @xfrm_policy_clone_security:
|
||||
* @old contains an existing xfrm_policy in the SPD.
|
||||
* @new contains a new xfrm_policy being cloned from old.
|
||||
* Allocate a security structure to the new->security field
|
||||
* that contains the information from the old->security field.
|
||||
* @old_ctx contains an existing xfrm_sec_ctx.
|
||||
* @new_ctxp contains a new xfrm_sec_ctx being cloned from old.
|
||||
* Allocate a security structure in new_ctxp that contains the
|
||||
* information from the old_ctx structure.
|
||||
* Return 0 if operation was successful (memory to allocate).
|
||||
* @xfrm_policy_free_security:
|
||||
* @xp contains the xfrm_policy
|
||||
* @ctx contains the xfrm_sec_ctx
|
||||
* Deallocate xp->security.
|
||||
* @xfrm_policy_delete_security:
|
||||
* @xp contains the xfrm_policy.
|
||||
* @ctx contains the xfrm_sec_ctx.
|
||||
* Authorize deletion of xp->security.
|
||||
* @xfrm_state_alloc_security:
|
||||
* @x contains the xfrm_state being added to the Security Association
|
||||
@@ -947,7 +947,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
||||
* @x contains the xfrm_state.
|
||||
* Authorize deletion of x->security.
|
||||
* @xfrm_policy_lookup:
|
||||
* @xp contains the xfrm_policy for which the access control is being
|
||||
* @ctx contains the xfrm_sec_ctx for which the access control is being
|
||||
* checked.
|
||||
* @fl_secid contains the flow security label that is used to authorize
|
||||
* access to the policy xp.
|
||||
@@ -1454,17 +1454,17 @@ struct security_operations {
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK_XFRM
|
||||
int (*xfrm_policy_alloc_security) (struct xfrm_policy *xp,
|
||||
int (*xfrm_policy_alloc_security) (struct xfrm_sec_ctx **ctxp,
|
||||
struct xfrm_user_sec_ctx *sec_ctx);
|
||||
int (*xfrm_policy_clone_security) (struct xfrm_policy *old, struct xfrm_policy *new);
|
||||
void (*xfrm_policy_free_security) (struct xfrm_policy *xp);
|
||||
int (*xfrm_policy_delete_security) (struct xfrm_policy *xp);
|
||||
int (*xfrm_policy_clone_security) (struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctx);
|
||||
void (*xfrm_policy_free_security) (struct xfrm_sec_ctx *ctx);
|
||||
int (*xfrm_policy_delete_security) (struct xfrm_sec_ctx *ctx);
|
||||
int (*xfrm_state_alloc_security) (struct xfrm_state *x,
|
||||
struct xfrm_user_sec_ctx *sec_ctx,
|
||||
u32 secid);
|
||||
void (*xfrm_state_free_security) (struct xfrm_state *x);
|
||||
int (*xfrm_state_delete_security) (struct xfrm_state *x);
|
||||
int (*xfrm_policy_lookup)(struct xfrm_policy *xp, u32 fl_secid, u8 dir);
|
||||
int (*xfrm_policy_lookup)(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
|
||||
int (*xfrm_state_pol_flow_match)(struct xfrm_state *x,
|
||||
struct xfrm_policy *xp, struct flowi *fl);
|
||||
int (*xfrm_decode_session)(struct sk_buff *skb, u32 *secid, int ckall);
|
||||
@@ -2562,16 +2562,16 @@ static inline void security_inet_conn_established(struct sock *sk,
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK_XFRM
|
||||
|
||||
int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx);
|
||||
int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new);
|
||||
void security_xfrm_policy_free(struct xfrm_policy *xp);
|
||||
int security_xfrm_policy_delete(struct xfrm_policy *xp);
|
||||
int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *sec_ctx);
|
||||
int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp);
|
||||
void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx);
|
||||
int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx);
|
||||
int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx);
|
||||
int security_xfrm_state_alloc_acquire(struct xfrm_state *x,
|
||||
struct xfrm_sec_ctx *polsec, u32 secid);
|
||||
int security_xfrm_state_delete(struct xfrm_state *x);
|
||||
void security_xfrm_state_free(struct xfrm_state *x);
|
||||
int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 fl_secid, u8 dir);
|
||||
int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
|
||||
int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
|
||||
struct xfrm_policy *xp, struct flowi *fl);
|
||||
int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid);
|
||||
@@ -2579,21 +2579,21 @@ void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl);
|
||||
|
||||
#else /* CONFIG_SECURITY_NETWORK_XFRM */
|
||||
|
||||
static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
static inline int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
|
||||
static inline int security_xfrm_policy_clone(struct xfrm_sec_ctx *old, struct xfrm_sec_ctx **new_ctxp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void security_xfrm_policy_free(struct xfrm_policy *xp)
|
||||
static inline void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_delete(struct xfrm_policy *xp)
|
||||
static inline int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -2619,7 +2619,7 @@ static inline int security_xfrm_state_delete(struct xfrm_state *x)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 fl_secid, u8 dir)
|
||||
static inline int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -62,18 +62,5 @@ extern struct list_head *seq_list_start_head(struct list_head *head,
|
||||
extern struct list_head *seq_list_next(void *v, struct list_head *head,
|
||||
loff_t *ppos);
|
||||
|
||||
struct net;
|
||||
struct seq_net_private {
|
||||
struct net *net;
|
||||
};
|
||||
|
||||
int seq_open_net(struct inode *, struct file *,
|
||||
const struct seq_operations *, int);
|
||||
int seq_release_net(struct inode *, struct file *);
|
||||
static inline struct net *seq_file_net(struct seq_file *seq)
|
||||
{
|
||||
return ((struct seq_net_private *)seq->private)->net;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef __SEQ_FILE_NET_H__
|
||||
#define __SEQ_FILE_NET_H__
|
||||
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
struct net;
|
||||
extern struct net init_net;
|
||||
|
||||
struct seq_net_private {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
};
|
||||
|
||||
int seq_open_net(struct inode *, struct file *,
|
||||
const struct seq_operations *, int);
|
||||
int seq_release_net(struct inode *, struct file *);
|
||||
static inline struct net *seq_file_net(struct seq_file *seq)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return ((struct seq_net_private *)seq->private)->net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
+51
-155
@@ -256,7 +256,10 @@ struct sk_buff {
|
||||
ktime_t tstamp;
|
||||
struct net_device *dev;
|
||||
|
||||
struct dst_entry *dst;
|
||||
union {
|
||||
struct dst_entry *dst;
|
||||
struct rtable *rtable;
|
||||
};
|
||||
struct sec_path *sp;
|
||||
|
||||
/*
|
||||
@@ -310,7 +313,10 @@ struct sk_buff {
|
||||
__u16 tc_verd; /* traffic control verdict */
|
||||
#endif
|
||||
#endif
|
||||
/* 2 byte hole */
|
||||
#ifdef CONFIG_IPV6_NDISC_NODETYPE
|
||||
__u8 ndisc_nodetype:2;
|
||||
#endif
|
||||
/* 14 bit hole */
|
||||
|
||||
#ifdef CONFIG_NET_DMA
|
||||
dma_cookie_t dma_cookie;
|
||||
@@ -657,11 +663,21 @@ static inline void skb_queue_head_init_class(struct sk_buff_head *list,
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert an sk_buff at the start of a list.
|
||||
* Insert an sk_buff on a list.
|
||||
*
|
||||
* The "__skb_xxxx()" functions are the non-atomic ones that
|
||||
* can only be called with interrupts disabled.
|
||||
*/
|
||||
extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
|
||||
static inline void __skb_insert(struct sk_buff *newsk,
|
||||
struct sk_buff *prev, struct sk_buff *next,
|
||||
struct sk_buff_head *list)
|
||||
{
|
||||
newsk->next = next;
|
||||
newsk->prev = prev;
|
||||
next->prev = prev->next = newsk;
|
||||
list->qlen++;
|
||||
}
|
||||
|
||||
/**
|
||||
* __skb_queue_after - queue a buffer at the list head
|
||||
@@ -678,13 +694,17 @@ static inline void __skb_queue_after(struct sk_buff_head *list,
|
||||
struct sk_buff *prev,
|
||||
struct sk_buff *newsk)
|
||||
{
|
||||
struct sk_buff *next;
|
||||
list->qlen++;
|
||||
__skb_insert(newsk, prev, prev->next, list);
|
||||
}
|
||||
|
||||
next = prev->next;
|
||||
newsk->next = next;
|
||||
newsk->prev = prev;
|
||||
next->prev = prev->next = newsk;
|
||||
extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
|
||||
struct sk_buff_head *list);
|
||||
|
||||
static inline void __skb_queue_before(struct sk_buff_head *list,
|
||||
struct sk_buff *next,
|
||||
struct sk_buff *newsk)
|
||||
{
|
||||
__skb_insert(newsk, next->prev, next, list);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -718,66 +738,7 @@ extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
|
||||
static inline void __skb_queue_tail(struct sk_buff_head *list,
|
||||
struct sk_buff *newsk)
|
||||
{
|
||||
struct sk_buff *prev, *next;
|
||||
|
||||
list->qlen++;
|
||||
next = (struct sk_buff *)list;
|
||||
prev = next->prev;
|
||||
newsk->next = next;
|
||||
newsk->prev = prev;
|
||||
next->prev = prev->next = newsk;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* __skb_dequeue - remove from the head of the queue
|
||||
* @list: list to dequeue from
|
||||
*
|
||||
* Remove the head of the list. This function does not take any locks
|
||||
* so must be used with appropriate locks held only. The head item is
|
||||
* returned or %NULL if the list is empty.
|
||||
*/
|
||||
extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
|
||||
static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
|
||||
{
|
||||
struct sk_buff *next, *prev, *result;
|
||||
|
||||
prev = (struct sk_buff *) list;
|
||||
next = prev->next;
|
||||
result = NULL;
|
||||
if (next != prev) {
|
||||
result = next;
|
||||
next = next->next;
|
||||
list->qlen--;
|
||||
next->prev = prev;
|
||||
prev->next = next;
|
||||
result->next = result->prev = NULL;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Insert a packet on a list.
|
||||
*/
|
||||
extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
|
||||
static inline void __skb_insert(struct sk_buff *newsk,
|
||||
struct sk_buff *prev, struct sk_buff *next,
|
||||
struct sk_buff_head *list)
|
||||
{
|
||||
newsk->next = next;
|
||||
newsk->prev = prev;
|
||||
next->prev = prev->next = newsk;
|
||||
list->qlen++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Place a packet after a given packet in a list.
|
||||
*/
|
||||
extern void skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
|
||||
static inline void __skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list)
|
||||
{
|
||||
__skb_insert(newsk, old, old->next, list);
|
||||
__skb_queue_before(list, (struct sk_buff *)list, newsk);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -797,8 +758,22 @@ static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
|
||||
prev->next = next;
|
||||
}
|
||||
|
||||
|
||||
/* XXX: more streamlined implementation */
|
||||
/**
|
||||
* __skb_dequeue - remove from the head of the queue
|
||||
* @list: list to dequeue from
|
||||
*
|
||||
* Remove the head of the list. This function does not take any locks
|
||||
* so must be used with appropriate locks held only. The head item is
|
||||
* returned or %NULL if the list is empty.
|
||||
*/
|
||||
extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
|
||||
static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
|
||||
{
|
||||
struct sk_buff *skb = skb_peek(list);
|
||||
if (skb)
|
||||
__skb_unlink(skb, list);
|
||||
return skb;
|
||||
}
|
||||
|
||||
/**
|
||||
* __skb_dequeue_tail - remove from the tail of the queue
|
||||
@@ -889,6 +864,7 @@ static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
|
||||
/*
|
||||
* Add data to an sk_buff
|
||||
*/
|
||||
extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
|
||||
static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
unsigned char *tmp = skb_tail_pointer(skb);
|
||||
@@ -898,26 +874,7 @@ static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_put - add data to a buffer
|
||||
* @skb: buffer to use
|
||||
* @len: amount of data to add
|
||||
*
|
||||
* This function extends the used data area of the buffer. If this would
|
||||
* exceed the total buffer size the kernel will panic. A pointer to the
|
||||
* first byte of the extra data is returned.
|
||||
*/
|
||||
static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
unsigned char *tmp = skb_tail_pointer(skb);
|
||||
SKB_LINEAR_ASSERT(skb);
|
||||
skb->tail += len;
|
||||
skb->len += len;
|
||||
if (unlikely(skb->tail > skb->end))
|
||||
skb_over_panic(skb, len, current_text_addr());
|
||||
return tmp;
|
||||
}
|
||||
|
||||
extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
|
||||
static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
skb->data -= len;
|
||||
@@ -925,24 +882,7 @@ static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
|
||||
return skb->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_push - add data to the start of a buffer
|
||||
* @skb: buffer to use
|
||||
* @len: amount of data to add
|
||||
*
|
||||
* This function extends the used data area of the buffer at the buffer
|
||||
* start. If this would exceed the total buffer headroom the kernel will
|
||||
* panic. A pointer to the first byte of the extra data is returned.
|
||||
*/
|
||||
static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
skb->data -= len;
|
||||
skb->len += len;
|
||||
if (unlikely(skb->data<skb->head))
|
||||
skb_under_panic(skb, len, current_text_addr());
|
||||
return skb->data;
|
||||
}
|
||||
|
||||
extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
|
||||
static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
skb->len -= len;
|
||||
@@ -950,21 +890,6 @@ static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
|
||||
return skb->data += len;
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_pull - remove data from the start of a buffer
|
||||
* @skb: buffer to use
|
||||
* @len: amount of data to remove
|
||||
*
|
||||
* This function removes data from the start of a buffer, returning
|
||||
* the memory to the headroom. A pointer to the next data in the buffer
|
||||
* is returned. Once the data has been pulled future pushes will overwrite
|
||||
* the old data.
|
||||
*/
|
||||
static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
|
||||
}
|
||||
|
||||
extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
|
||||
|
||||
static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
|
||||
@@ -1205,21 +1130,7 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
|
||||
skb_set_tail_pointer(skb, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_trim - remove end from a buffer
|
||||
* @skb: buffer to alter
|
||||
* @len: new length
|
||||
*
|
||||
* Cut the length of a buffer down by removing data from the tail. If
|
||||
* the buffer is already under the length specified it is not modified.
|
||||
* The skb must be linear.
|
||||
*/
|
||||
static inline void skb_trim(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
if (skb->len > len)
|
||||
__skb_trim(skb, len);
|
||||
}
|
||||
|
||||
extern void skb_trim(struct sk_buff *skb, unsigned int len);
|
||||
|
||||
static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
@@ -1302,22 +1213,7 @@ static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
|
||||
return skb;
|
||||
}
|
||||
|
||||
/**
|
||||
* dev_alloc_skb - allocate an skbuff for receiving
|
||||
* @length: length to allocate
|
||||
*
|
||||
* Allocate a new &sk_buff and assign it a usage count of one. The
|
||||
* buffer has unspecified headroom built in. Users should allocate
|
||||
* the headroom they think they need without accounting for the
|
||||
* built in space. The built in space is used for optimisations.
|
||||
*
|
||||
* %NULL is returned if there is no free memory. Although this function
|
||||
* allocates memory it can be called from an interrupt.
|
||||
*/
|
||||
static inline struct sk_buff *dev_alloc_skb(unsigned int length)
|
||||
{
|
||||
return __dev_alloc_skb(length, GFP_ATOMIC);
|
||||
}
|
||||
extern struct sk_buff *dev_alloc_skb(unsigned int length);
|
||||
|
||||
extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
|
||||
unsigned int length, gfp_t gfp_mask);
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef __SMC91X_H__
|
||||
#define __SMC91X_H__
|
||||
|
||||
#define SMC91X_USE_8BIT (1 << 0)
|
||||
#define SMC91X_USE_16BIT (1 << 1)
|
||||
#define SMC91X_USE_32BIT (1 << 2)
|
||||
|
||||
struct smc91x_platdata {
|
||||
unsigned long flags;
|
||||
unsigned long irq_flags; /* IRQF_... */
|
||||
};
|
||||
|
||||
#endif /* __SMC91X_H__ */
|
||||
+45
-5
@@ -72,10 +72,18 @@ struct ssb_device;
|
||||
/* Lowlevel read/write operations on the device MMIO.
|
||||
* Internal, don't use that outside of ssb. */
|
||||
struct ssb_bus_ops {
|
||||
u8 (*read8)(struct ssb_device *dev, u16 offset);
|
||||
u16 (*read16)(struct ssb_device *dev, u16 offset);
|
||||
u32 (*read32)(struct ssb_device *dev, u16 offset);
|
||||
void (*write8)(struct ssb_device *dev, u16 offset, u8 value);
|
||||
void (*write16)(struct ssb_device *dev, u16 offset, u16 value);
|
||||
void (*write32)(struct ssb_device *dev, u16 offset, u32 value);
|
||||
#ifdef CONFIG_SSB_BLOCKIO
|
||||
void (*block_read)(struct ssb_device *dev, void *buffer,
|
||||
size_t count, u16 offset, u8 reg_width);
|
||||
void (*block_write)(struct ssb_device *dev, const void *buffer,
|
||||
size_t count, u16 offset, u8 reg_width);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -247,9 +255,9 @@ struct ssb_bus {
|
||||
/* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */
|
||||
struct pcmcia_device *host_pcmcia;
|
||||
|
||||
#ifdef CONFIG_SSB_PCIHOST
|
||||
#ifdef CONFIG_SSB_SPROM
|
||||
/* Mutex to protect the SPROM writing. */
|
||||
struct mutex pci_sprom_mutex;
|
||||
struct mutex sprom_mutex;
|
||||
#endif
|
||||
|
||||
/* ID information about the Chip. */
|
||||
@@ -262,9 +270,6 @@ struct ssb_bus {
|
||||
struct ssb_device devices[SSB_MAX_NR_CORES];
|
||||
u8 nr_devices;
|
||||
|
||||
/* Reference count. Number of suspended devices. */
|
||||
u8 suspend_cnt;
|
||||
|
||||
/* Software ID number for this bus. */
|
||||
unsigned int busnumber;
|
||||
|
||||
@@ -336,6 +341,13 @@ extern int ssb_bus_pcmciabus_register(struct ssb_bus *bus,
|
||||
|
||||
extern void ssb_bus_unregister(struct ssb_bus *bus);
|
||||
|
||||
/* Suspend a SSB bus.
|
||||
* Call this from the parent bus suspend routine. */
|
||||
extern int ssb_bus_suspend(struct ssb_bus *bus);
|
||||
/* Resume a SSB bus.
|
||||
* Call this from the parent bus resume routine. */
|
||||
extern int ssb_bus_resume(struct ssb_bus *bus);
|
||||
|
||||
extern u32 ssb_clockspeed(struct ssb_bus *bus);
|
||||
|
||||
/* Is the device enabled in hardware? */
|
||||
@@ -348,6 +360,10 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags);
|
||||
|
||||
|
||||
/* Device MMIO register read/write functions. */
|
||||
static inline u8 ssb_read8(struct ssb_device *dev, u16 offset)
|
||||
{
|
||||
return dev->ops->read8(dev, offset);
|
||||
}
|
||||
static inline u16 ssb_read16(struct ssb_device *dev, u16 offset)
|
||||
{
|
||||
return dev->ops->read16(dev, offset);
|
||||
@@ -356,6 +372,10 @@ static inline u32 ssb_read32(struct ssb_device *dev, u16 offset)
|
||||
{
|
||||
return dev->ops->read32(dev, offset);
|
||||
}
|
||||
static inline void ssb_write8(struct ssb_device *dev, u16 offset, u8 value)
|
||||
{
|
||||
dev->ops->write8(dev, offset, value);
|
||||
}
|
||||
static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value)
|
||||
{
|
||||
dev->ops->write16(dev, offset, value);
|
||||
@@ -364,6 +384,19 @@ static inline void ssb_write32(struct ssb_device *dev, u16 offset, u32 value)
|
||||
{
|
||||
dev->ops->write32(dev, offset, value);
|
||||
}
|
||||
#ifdef CONFIG_SSB_BLOCKIO
|
||||
static inline void ssb_block_read(struct ssb_device *dev, void *buffer,
|
||||
size_t count, u16 offset, u8 reg_width)
|
||||
{
|
||||
dev->ops->block_read(dev, buffer, count, offset, reg_width);
|
||||
}
|
||||
|
||||
static inline void ssb_block_write(struct ssb_device *dev, const void *buffer,
|
||||
size_t count, u16 offset, u8 reg_width)
|
||||
{
|
||||
dev->ops->block_write(dev, buffer, count, offset, reg_width);
|
||||
}
|
||||
#endif /* CONFIG_SSB_BLOCKIO */
|
||||
|
||||
|
||||
/* Translation (routing) bits that need to be ORed to DMA
|
||||
@@ -416,5 +449,12 @@ extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl);
|
||||
extern u32 ssb_admatch_base(u32 adm);
|
||||
extern u32 ssb_admatch_size(u32 adm);
|
||||
|
||||
/* PCI device mapping and fixup routines.
|
||||
* Called from the architecture pcibios init code.
|
||||
* These are only available on SSB_EMBEDDED configurations. */
|
||||
#ifdef CONFIG_SSB_EMBEDDED
|
||||
int ssb_pcibios_plat_dev_init(struct pci_dev *dev);
|
||||
int ssb_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
#endif /* CONFIG_SSB_EMBEDDED */
|
||||
|
||||
#endif /* LINUX_SSB_H_ */
|
||||
|
||||
@@ -367,8 +367,7 @@ static inline bool ssb_chipco_available(struct ssb_chipcommon *cc)
|
||||
|
||||
extern void ssb_chipcommon_init(struct ssb_chipcommon *cc);
|
||||
|
||||
#include <linux/pm.h>
|
||||
extern void ssb_chipco_suspend(struct ssb_chipcommon *cc, pm_message_t state);
|
||||
extern void ssb_chipco_suspend(struct ssb_chipcommon *cc);
|
||||
extern void ssb_chipco_resume(struct ssb_chipcommon *cc);
|
||||
|
||||
extern void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc,
|
||||
@@ -390,6 +389,10 @@ extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
|
||||
extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
|
||||
u32 ticks);
|
||||
|
||||
void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value);
|
||||
|
||||
u32 ssb_chipco_irq_status(struct ssb_chipcommon *cc, u32 mask);
|
||||
|
||||
/* Chipcommon GPIO pin access. */
|
||||
u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
|
||||
u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
#ifndef LINUX_SSB_DRIVER_GIGE_H_
|
||||
#define LINUX_SSB_DRIVER_GIGE_H_
|
||||
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
|
||||
#ifdef CONFIG_SSB_DRIVER_GIGE
|
||||
|
||||
|
||||
#define SSB_GIGE_PCIIO 0x0000 /* PCI I/O Registers (1024 bytes) */
|
||||
#define SSB_GIGE_RESERVED 0x0400 /* Reserved (1024 bytes) */
|
||||
#define SSB_GIGE_PCICFG 0x0800 /* PCI config space (256 bytes) */
|
||||
#define SSB_GIGE_SHIM_FLUSHSTAT 0x0C00 /* PCI to OCP: Flush status control (32bit) */
|
||||
#define SSB_GIGE_SHIM_FLUSHRDA 0x0C04 /* PCI to OCP: Flush read address (32bit) */
|
||||
#define SSB_GIGE_SHIM_FLUSHTO 0x0C08 /* PCI to OCP: Flush timeout counter (32bit) */
|
||||
#define SSB_GIGE_SHIM_BARRIER 0x0C0C /* PCI to OCP: Barrier register (32bit) */
|
||||
#define SSB_GIGE_SHIM_MAOCPSI 0x0C10 /* PCI to OCP: MaocpSI Control (32bit) */
|
||||
#define SSB_GIGE_SHIM_SIOCPMA 0x0C14 /* PCI to OCP: SiocpMa Control (32bit) */
|
||||
|
||||
/* TM Status High flags */
|
||||
#define SSB_GIGE_TMSHIGH_RGMII 0x00010000 /* Have an RGMII PHY-bus */
|
||||
/* TM Status Low flags */
|
||||
#define SSB_GIGE_TMSLOW_TXBYPASS 0x00080000 /* TX bypass (no delay) */
|
||||
#define SSB_GIGE_TMSLOW_RXBYPASS 0x00100000 /* RX bypass (no delay) */
|
||||
#define SSB_GIGE_TMSLOW_DLLEN 0x01000000 /* Enable DLL controls */
|
||||
|
||||
/* Boardflags (low) */
|
||||
#define SSB_GIGE_BFL_ROBOSWITCH 0x0010
|
||||
|
||||
|
||||
#define SSB_GIGE_MEM_RES_NAME "SSB Broadcom 47xx GigE memory"
|
||||
#define SSB_GIGE_IO_RES_NAME "SSB Broadcom 47xx GigE I/O"
|
||||
|
||||
struct ssb_gige {
|
||||
struct ssb_device *dev;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
/* True, if the device has an RGMII bus.
|
||||
* False, if the device has a GMII bus. */
|
||||
bool has_rgmii;
|
||||
|
||||
/* The PCI controller device. */
|
||||
struct pci_controller pci_controller;
|
||||
struct pci_ops pci_ops;
|
||||
struct resource mem_resource;
|
||||
struct resource io_resource;
|
||||
};
|
||||
|
||||
/* Check whether a PCI device is a SSB Gigabit Ethernet core. */
|
||||
extern bool pdev_is_ssb_gige_core(struct pci_dev *pdev);
|
||||
|
||||
/* Convert a pci_dev pointer to a ssb_gige pointer. */
|
||||
static inline struct ssb_gige * pdev_to_ssb_gige(struct pci_dev *pdev)
|
||||
{
|
||||
if (!pdev_is_ssb_gige_core(pdev))
|
||||
return NULL;
|
||||
return container_of(pdev->bus->ops, struct ssb_gige, pci_ops);
|
||||
}
|
||||
|
||||
/* Returns whether the PHY is connected by an RGMII bus. */
|
||||
static inline bool ssb_gige_is_rgmii(struct pci_dev *pdev)
|
||||
{
|
||||
struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
|
||||
return (dev ? dev->has_rgmii : 0);
|
||||
}
|
||||
|
||||
/* Returns whether we have a Roboswitch. */
|
||||
static inline bool ssb_gige_have_roboswitch(struct pci_dev *pdev)
|
||||
{
|
||||
struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
|
||||
if (dev)
|
||||
return !!(dev->dev->bus->sprom.boardflags_lo &
|
||||
SSB_GIGE_BFL_ROBOSWITCH);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns whether we can only do one DMA at once. */
|
||||
static inline bool ssb_gige_one_dma_at_once(struct pci_dev *pdev)
|
||||
{
|
||||
struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
|
||||
if (dev)
|
||||
return ((dev->dev->bus->chip_id == 0x4785) &&
|
||||
(dev->dev->bus->chip_rev < 2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns whether we must flush posted writes. */
|
||||
static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)
|
||||
{
|
||||
struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
|
||||
if (dev)
|
||||
return (dev->dev->bus->chip_id == 0x4785);
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern char * nvram_get(const char *name);
|
||||
/* Get the device MAC address */
|
||||
static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr)
|
||||
{
|
||||
#ifdef CONFIG_BCM947XX
|
||||
char *res = nvram_get("et0macaddr");
|
||||
if (res)
|
||||
memcpy(macaddr, res, 6);
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,
|
||||
struct pci_dev *pdev);
|
||||
extern int ssb_gige_map_irq(struct ssb_device *sdev,
|
||||
const struct pci_dev *pdev);
|
||||
|
||||
/* The GigE driver is not a standalone module, because we don't have support
|
||||
* for unregistering the driver. So we could not unload the module anyway. */
|
||||
extern int ssb_gige_init(void);
|
||||
static inline void ssb_gige_exit(void)
|
||||
{
|
||||
/* Currently we can not unregister the GigE driver,
|
||||
* because we can not unregister the PCI bridge. */
|
||||
BUG();
|
||||
}
|
||||
|
||||
|
||||
#else /* CONFIG_SSB_DRIVER_GIGE */
|
||||
/* Gigabit Ethernet driver disabled */
|
||||
|
||||
|
||||
static inline int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
static inline int ssb_gige_map_irq(struct ssb_device *sdev,
|
||||
const struct pci_dev *pdev)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
static inline int ssb_gige_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void ssb_gige_exit(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool pdev_is_ssb_gige_core(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline struct ssb_gige * pdev_to_ssb_gige(struct pci_dev *pdev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline bool ssb_gige_is_rgmii(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline bool ssb_gige_have_roboswitch(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline bool ssb_gige_one_dma_at_once(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SSB_DRIVER_GIGE */
|
||||
#endif /* LINUX_SSB_DRIVER_GIGE_H_ */
|
||||
@@ -1,6 +1,11 @@
|
||||
#ifndef LINUX_SSB_PCICORE_H_
|
||||
#define LINUX_SSB_PCICORE_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct pci_dev;
|
||||
|
||||
|
||||
#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
|
||||
/* PCI core registers. */
|
||||
@@ -88,6 +93,9 @@ extern void ssb_pcicore_init(struct ssb_pcicore *pc);
|
||||
extern int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
|
||||
struct ssb_device *dev);
|
||||
|
||||
int ssb_pcicore_plat_dev_init(struct pci_dev *d);
|
||||
int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
|
||||
|
||||
#else /* CONFIG_SSB_DRIVER_PCICORE */
|
||||
|
||||
@@ -107,5 +115,16 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ssb_pcicore_plat_dev_init(struct pci_dev *d)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline
|
||||
int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SSB_DRIVER_PCICORE */
|
||||
#endif /* LINUX_SSB_PCICORE_H_ */
|
||||
|
||||
@@ -239,6 +239,11 @@ static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)
|
||||
return (struct tcp_request_sock *)req;
|
||||
}
|
||||
|
||||
struct tcp_deferred_accept_info {
|
||||
struct sock *listen_sk;
|
||||
struct request_sock *request;
|
||||
};
|
||||
|
||||
struct tcp_sock {
|
||||
/* inet_connection_sock has to be the first member of tcp_sock */
|
||||
struct inet_connection_sock inet_conn;
|
||||
@@ -374,6 +379,8 @@ struct tcp_sock {
|
||||
unsigned int keepalive_intvl; /* time interval between keep alive probes */
|
||||
int linger2;
|
||||
|
||||
struct tcp_deferred_accept_info defer_tcp_accept;
|
||||
|
||||
unsigned long last_synq_overflow;
|
||||
|
||||
u32 tso_deferred;
|
||||
|
||||
+8
-11
@@ -26,15 +26,6 @@ struct udphdr {
|
||||
__sum16 check;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct udphdr *)skb_transport_header(skb);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* UDP socket options */
|
||||
#define UDP_CORK 1 /* Never send partially complete segments */
|
||||
#define UDP_ENCAP 100 /* Set the socket to accept encapsulated packets */
|
||||
@@ -45,9 +36,14 @@ static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
|
||||
#define UDP_ENCAP_L2TPINUDP 3 /* rfc2661 */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct udphdr *)skb_transport_header(skb);
|
||||
}
|
||||
|
||||
#define UDP_HTABLE_SIZE 128
|
||||
|
||||
struct udp_sock {
|
||||
@@ -82,6 +78,7 @@ static inline struct udp_sock *udp_sk(const struct sock *sk)
|
||||
{
|
||||
return (struct udp_sock *)sk;
|
||||
}
|
||||
|
||||
#define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -455,6 +455,7 @@
|
||||
#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */
|
||||
#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */
|
||||
#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */
|
||||
#define IW_MODE_MESH 7 /* Mesh (IEEE 802.11s) network */
|
||||
|
||||
/* Statistics flags (bitmask in updated) */
|
||||
#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */
|
||||
|
||||
@@ -113,7 +113,8 @@ enum
|
||||
{
|
||||
XFRM_POLICY_TYPE_MAIN = 0,
|
||||
XFRM_POLICY_TYPE_SUB = 1,
|
||||
XFRM_POLICY_TYPE_MAX = 2
|
||||
XFRM_POLICY_TYPE_MAX = 2,
|
||||
XFRM_POLICY_TYPE_ANY = 255
|
||||
};
|
||||
|
||||
enum
|
||||
|
||||
+39
-83
@@ -55,9 +55,12 @@ struct prefix_info {
|
||||
extern int addrconf_init(void);
|
||||
extern void addrconf_cleanup(void);
|
||||
|
||||
extern int addrconf_add_ifaddr(void __user *arg);
|
||||
extern int addrconf_del_ifaddr(void __user *arg);
|
||||
extern int addrconf_set_dstaddr(void __user *arg);
|
||||
extern int addrconf_add_ifaddr(struct net *net,
|
||||
void __user *arg);
|
||||
extern int addrconf_del_ifaddr(struct net *net,
|
||||
void __user *arg);
|
||||
extern int addrconf_set_dstaddr(struct net *net,
|
||||
void __user *arg);
|
||||
|
||||
extern int ipv6_chk_addr(struct net *net,
|
||||
struct in6_addr *addr,
|
||||
@@ -68,16 +71,18 @@ extern int ipv6_chk_addr(struct net *net,
|
||||
extern int ipv6_chk_home_addr(struct net *net,
|
||||
struct in6_addr *addr);
|
||||
#endif
|
||||
|
||||
extern int ipv6_chk_prefix(struct in6_addr *addr,
|
||||
struct net_device *dev);
|
||||
|
||||
extern struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net,
|
||||
struct in6_addr *addr,
|
||||
const struct in6_addr *addr,
|
||||
struct net_device *dev,
|
||||
int strict);
|
||||
|
||||
extern int ipv6_get_saddr(struct dst_entry *dst,
|
||||
struct in6_addr *daddr,
|
||||
struct in6_addr *saddr);
|
||||
extern int ipv6_dev_get_saddr(struct net_device *dev,
|
||||
struct in6_addr *daddr,
|
||||
const struct in6_addr *daddr,
|
||||
unsigned int srcprefs,
|
||||
struct in6_addr *saddr);
|
||||
extern int ipv6_get_lladdr(struct net_device *dev,
|
||||
struct in6_addr *addr,
|
||||
@@ -100,31 +105,31 @@ extern u32 ipv6_addr_label(const struct in6_addr *addr,
|
||||
/*
|
||||
* multicast prototypes (mcast.c)
|
||||
*/
|
||||
extern int ipv6_sock_mc_join(struct sock *sk, int ifindex,
|
||||
struct in6_addr *addr);
|
||||
extern int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
|
||||
struct in6_addr *addr);
|
||||
extern int ipv6_sock_mc_join(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
extern int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
extern void ipv6_sock_mc_close(struct sock *sk);
|
||||
extern int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
|
||||
struct in6_addr *src_addr);
|
||||
extern int inet6_mc_check(struct sock *sk,
|
||||
const struct in6_addr *mc_addr,
|
||||
const struct in6_addr *src_addr);
|
||||
|
||||
extern int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr);
|
||||
extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
|
||||
extern int ipv6_dev_mc_dec(struct net_device *dev, struct in6_addr *addr);
|
||||
extern int ipv6_dev_mc_inc(struct net_device *dev, const struct in6_addr *addr);
|
||||
extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr);
|
||||
extern int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr);
|
||||
extern void ipv6_mc_up(struct inet6_dev *idev);
|
||||
extern void ipv6_mc_down(struct inet6_dev *idev);
|
||||
extern void ipv6_mc_init_dev(struct inet6_dev *idev);
|
||||
extern void ipv6_mc_destroy_dev(struct inet6_dev *idev);
|
||||
extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);
|
||||
|
||||
extern int ipv6_chk_mcast_addr(struct net_device *dev, struct in6_addr *group,
|
||||
struct in6_addr *src_addr);
|
||||
extern int ipv6_chk_mcast_addr(struct net_device *dev,
|
||||
const struct in6_addr *group,
|
||||
const struct in6_addr *src_addr);
|
||||
extern int ipv6_is_mld(struct sk_buff *skb, int nexthdr);
|
||||
|
||||
extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len);
|
||||
|
||||
extern int ipv6_get_hoplimit(struct net_device *dev);
|
||||
|
||||
/*
|
||||
* anycast prototypes (anycast.c)
|
||||
*/
|
||||
@@ -135,7 +140,8 @@ extern int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
|
||||
|
||||
extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr);
|
||||
extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr);
|
||||
extern int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr);
|
||||
extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev,
|
||||
struct in6_addr *addr);
|
||||
|
||||
|
||||
/* Device notifier */
|
||||
@@ -185,26 +191,6 @@ static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
|
||||
#define in6_ifa_hold(ifp) atomic_inc(&(ifp)->refcnt)
|
||||
|
||||
|
||||
extern void addrconf_forwarding_on(void);
|
||||
/*
|
||||
* Hash function taken from net_alias.c
|
||||
*/
|
||||
|
||||
static __inline__ u8 ipv6_addr_hash(const struct in6_addr *addr)
|
||||
{
|
||||
__u32 word;
|
||||
|
||||
/*
|
||||
* We perform the hash function over the last 64 bits of the address
|
||||
* This will include the IEEE address token on links that support it.
|
||||
*/
|
||||
|
||||
word = (__force u32)(addr->s6_addr32[2] ^ addr->s6_addr32[3]);
|
||||
word ^= (word >> 16);
|
||||
word ^= (word >> 8);
|
||||
|
||||
return ((word ^ (word >> 4)) & 0x0f);
|
||||
}
|
||||
|
||||
/*
|
||||
* compute link-local solicited-node multicast address
|
||||
@@ -214,61 +200,31 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
|
||||
struct in6_addr *solicited)
|
||||
{
|
||||
ipv6_addr_set(solicited,
|
||||
__constant_htonl(0xFF020000), 0,
|
||||
__constant_htonl(0x1),
|
||||
__constant_htonl(0xFF000000) | addr->s6_addr32[3]);
|
||||
}
|
||||
|
||||
|
||||
static inline void ipv6_addr_all_nodes(struct in6_addr *addr)
|
||||
{
|
||||
ipv6_addr_set(addr,
|
||||
__constant_htonl(0xFF020000), 0, 0,
|
||||
__constant_htonl(0x1));
|
||||
}
|
||||
|
||||
static inline void ipv6_addr_all_routers(struct in6_addr *addr)
|
||||
{
|
||||
ipv6_addr_set(addr,
|
||||
__constant_htonl(0xFF020000), 0, 0,
|
||||
__constant_htonl(0x2));
|
||||
htonl(0xFF020000), 0,
|
||||
htonl(0x1),
|
||||
htonl(0xFF000000) | addr->s6_addr32[3]);
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
|
||||
{
|
||||
return (addr->s6_addr32[0] & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000);
|
||||
return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
|
||||
{
|
||||
return (addr->s6_addr32[0] == htonl(0xff020000) &&
|
||||
addr->s6_addr32[1] == 0 &&
|
||||
addr->s6_addr32[2] == 0 &&
|
||||
addr->s6_addr32[3] == htonl(0x00000001));
|
||||
return (((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
addr->s6_addr32[1] | addr->s6_addr32[2] |
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000001))) == 0);
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)
|
||||
{
|
||||
return (addr->s6_addr32[0] == htonl(0xff020000) &&
|
||||
addr->s6_addr32[1] == 0 &&
|
||||
addr->s6_addr32[2] == 0 &&
|
||||
addr->s6_addr32[3] == htonl(0x00000002));
|
||||
return (((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
addr->s6_addr32[1] | addr->s6_addr32[2] |
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000002))) == 0);
|
||||
}
|
||||
|
||||
static inline int ipv6_isatap_eui64(u8 *eui, __be32 addr)
|
||||
{
|
||||
eui[0] = (ipv4_is_zeronet(addr) || ipv4_is_private_10(addr) ||
|
||||
ipv4_is_loopback(addr) || ipv4_is_linklocal_169(addr) ||
|
||||
ipv4_is_private_172(addr) || ipv4_is_test_192(addr) ||
|
||||
ipv4_is_anycast_6to4(addr) || ipv4_is_private_192(addr) ||
|
||||
ipv4_is_test_198(addr) || ipv4_is_multicast(addr) ||
|
||||
ipv4_is_lbcast(addr)) ? 0x00 : 0x02;
|
||||
eui[1] = 0;
|
||||
eui[2] = 0x5E;
|
||||
eui[3] = 0xFE;
|
||||
memcpy (eui+4, &addr, 4);
|
||||
return 0;
|
||||
}
|
||||
extern int __ipv6_isatap_ifid(u8 *eui, __be32 addr);
|
||||
|
||||
static inline int ipv6_addr_is_isatap(const struct in6_addr *addr)
|
||||
{
|
||||
|
||||
+142
-17
@@ -12,6 +12,16 @@
|
||||
* Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
|
||||
*/
|
||||
|
||||
/**
|
||||
* struct vif_params - describes virtual interface parameters
|
||||
* @mesh_id: mesh ID to use
|
||||
* @mesh_id_len: length of the mesh ID
|
||||
*/
|
||||
struct vif_params {
|
||||
u8 *mesh_id;
|
||||
int mesh_id_len;
|
||||
};
|
||||
|
||||
/* Radiotap header iteration
|
||||
* implemented in net/wireless/radiotap.c
|
||||
* docs in Documentation/networking/radiotap-headers.txt
|
||||
@@ -108,6 +118,19 @@ enum station_flags {
|
||||
STATION_FLAG_WME = 1<<NL80211_STA_FLAG_WME,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum plink_action - actions to perform in mesh peers
|
||||
*
|
||||
* @PLINK_ACTION_INVALID: action 0 is reserved
|
||||
* @PLINK_ACTION_OPEN: start mesh peer link establishment
|
||||
* @PLINK_ACTION_BLOCL: block traffic from this mesh peer
|
||||
*/
|
||||
enum plink_actions {
|
||||
PLINK_ACTION_INVALID,
|
||||
PLINK_ACTION_OPEN,
|
||||
PLINK_ACTION_BLOCK,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct station_parameters - station parameters
|
||||
*
|
||||
@@ -128,41 +151,124 @@ struct station_parameters {
|
||||
int listen_interval;
|
||||
u16 aid;
|
||||
u8 supported_rates_len;
|
||||
u8 plink_action;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum station_stats_flags - station statistics flags
|
||||
* enum station_info_flags - station information flags
|
||||
*
|
||||
* Used by the driver to indicate which info in &struct station_stats
|
||||
* it has filled in during get_station().
|
||||
* Used by the driver to indicate which info in &struct station_info
|
||||
* it has filled in during get_station() or dump_station().
|
||||
*
|
||||
* @STATION_STAT_INACTIVE_TIME: @inactive_time filled
|
||||
* @STATION_STAT_RX_BYTES: @rx_bytes filled
|
||||
* @STATION_STAT_TX_BYTES: @tx_bytes filled
|
||||
* @STATION_INFO_INACTIVE_TIME: @inactive_time filled
|
||||
* @STATION_INFO_RX_BYTES: @rx_bytes filled
|
||||
* @STATION_INFO_TX_BYTES: @tx_bytes filled
|
||||
* @STATION_INFO_LLID: @llid filled
|
||||
* @STATION_INFO_PLID: @plid filled
|
||||
* @STATION_INFO_PLINK_STATE: @plink_state filled
|
||||
*/
|
||||
enum station_stats_flags {
|
||||
STATION_STAT_INACTIVE_TIME = 1<<0,
|
||||
STATION_STAT_RX_BYTES = 1<<1,
|
||||
STATION_STAT_TX_BYTES = 1<<2,
|
||||
enum station_info_flags {
|
||||
STATION_INFO_INACTIVE_TIME = 1<<0,
|
||||
STATION_INFO_RX_BYTES = 1<<1,
|
||||
STATION_INFO_TX_BYTES = 1<<2,
|
||||
STATION_INFO_LLID = 1<<3,
|
||||
STATION_INFO_PLID = 1<<4,
|
||||
STATION_INFO_PLINK_STATE = 1<<5,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct station_stats - station statistics
|
||||
* struct station_info - station information
|
||||
*
|
||||
* Station information filled by driver for get_station().
|
||||
* Station information filled by driver for get_station() and dump_station.
|
||||
*
|
||||
* @filled: bitflag of flags from &enum station_stats_flags
|
||||
* @filled: bitflag of flags from &enum station_info_flags
|
||||
* @inactive_time: time since last station activity (tx/rx) in milliseconds
|
||||
* @rx_bytes: bytes received from this station
|
||||
* @tx_bytes: bytes transmitted to this station
|
||||
* @llid: mesh local link id
|
||||
* @plid: mesh peer link id
|
||||
* @plink_state: mesh peer link state
|
||||
*/
|
||||
struct station_stats {
|
||||
struct station_info {
|
||||
u32 filled;
|
||||
u32 inactive_time;
|
||||
u32 rx_bytes;
|
||||
u32 tx_bytes;
|
||||
u16 llid;
|
||||
u16 plid;
|
||||
u8 plink_state;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum monitor_flags - monitor flags
|
||||
*
|
||||
* Monitor interface configuration flags. Note that these must be the bits
|
||||
* according to the nl80211 flags.
|
||||
*
|
||||
* @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS
|
||||
* @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
|
||||
* @MONITOR_FLAG_CONTROL: pass control frames
|
||||
* @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
|
||||
* @MONITOR_FLAG_COOK_FRAMES: report frames after processing
|
||||
*/
|
||||
enum monitor_flags {
|
||||
MONITOR_FLAG_FCSFAIL = 1<<NL80211_MNTR_FLAG_FCSFAIL,
|
||||
MONITOR_FLAG_PLCPFAIL = 1<<NL80211_MNTR_FLAG_PLCPFAIL,
|
||||
MONITOR_FLAG_CONTROL = 1<<NL80211_MNTR_FLAG_CONTROL,
|
||||
MONITOR_FLAG_OTHER_BSS = 1<<NL80211_MNTR_FLAG_OTHER_BSS,
|
||||
MONITOR_FLAG_COOK_FRAMES = 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mpath_info_flags - mesh path information flags
|
||||
*
|
||||
* Used by the driver to indicate which info in &struct mpath_info it has filled
|
||||
* in during get_station() or dump_station().
|
||||
*
|
||||
* MPATH_INFO_FRAME_QLEN: @frame_qlen filled
|
||||
* MPATH_INFO_DSN: @dsn filled
|
||||
* MPATH_INFO_METRIC: @metric filled
|
||||
* MPATH_INFO_EXPTIME: @exptime filled
|
||||
* MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled
|
||||
* MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled
|
||||
* MPATH_INFO_FLAGS: @flags filled
|
||||
*/
|
||||
enum mpath_info_flags {
|
||||
MPATH_INFO_FRAME_QLEN = BIT(0),
|
||||
MPATH_INFO_DSN = BIT(1),
|
||||
MPATH_INFO_METRIC = BIT(2),
|
||||
MPATH_INFO_EXPTIME = BIT(3),
|
||||
MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4),
|
||||
MPATH_INFO_DISCOVERY_RETRIES = BIT(5),
|
||||
MPATH_INFO_FLAGS = BIT(6),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mpath_info - mesh path information
|
||||
*
|
||||
* Mesh path information filled by driver for get_mpath() and dump_mpath().
|
||||
*
|
||||
* @filled: bitfield of flags from &enum mpath_info_flags
|
||||
* @frame_qlen: number of queued frames for this destination
|
||||
* @dsn: destination sequence number
|
||||
* @metric: metric (cost) of this mesh path
|
||||
* @exptime: expiration time for the mesh path from now, in msecs
|
||||
* @flags: mesh path flags
|
||||
* @discovery_timeout: total mesh path discovery timeout, in msecs
|
||||
* @discovery_retries: mesh path discovery retries
|
||||
*/
|
||||
struct mpath_info {
|
||||
u32 filled;
|
||||
u32 frame_qlen;
|
||||
u32 dsn;
|
||||
u32 metric;
|
||||
u32 exptime;
|
||||
u32 discovery_timeout;
|
||||
u8 discovery_retries;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
|
||||
/* from net/wireless.h */
|
||||
struct wiphy;
|
||||
|
||||
@@ -210,13 +316,17 @@ struct wiphy;
|
||||
* @del_station: Remove a station; @mac may be NULL to remove all stations.
|
||||
*
|
||||
* @change_station: Modify a given station.
|
||||
*
|
||||
* @set_mesh_cfg: set mesh parameters (by now, just mesh id)
|
||||
*/
|
||||
struct cfg80211_ops {
|
||||
int (*add_virtual_intf)(struct wiphy *wiphy, char *name,
|
||||
enum nl80211_iftype type);
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
struct vif_params *params);
|
||||
int (*del_virtual_intf)(struct wiphy *wiphy, int ifindex);
|
||||
int (*change_virtual_intf)(struct wiphy *wiphy, int ifindex,
|
||||
enum nl80211_iftype type);
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
struct vif_params *params);
|
||||
|
||||
int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, u8 *mac_addr,
|
||||
@@ -244,7 +354,22 @@ struct cfg80211_ops {
|
||||
int (*change_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *mac, struct station_parameters *params);
|
||||
int (*get_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *mac, struct station_stats *stats);
|
||||
u8 *mac, struct station_info *sinfo);
|
||||
int (*dump_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int idx, u8 *mac, struct station_info *sinfo);
|
||||
|
||||
int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *dst, u8 *next_hop);
|
||||
int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *dst);
|
||||
int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *dst, u8 *next_hop);
|
||||
int (*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *dst, u8 *next_hop,
|
||||
struct mpath_info *pinfo);
|
||||
int (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int idx, u8 *dst, u8 *next_hop,
|
||||
struct mpath_info *pinfo);
|
||||
};
|
||||
|
||||
#endif /* __NET_CFG80211_H */
|
||||
|
||||
+1
-9
@@ -163,15 +163,7 @@ struct dst_entry * dst_clone(struct dst_entry * dst)
|
||||
return dst;
|
||||
}
|
||||
|
||||
static inline
|
||||
void dst_release(struct dst_entry * dst)
|
||||
{
|
||||
if (dst) {
|
||||
WARN_ON(atomic_read(&dst->__refcnt) < 1);
|
||||
smp_mb__before_atomic_dec();
|
||||
atomic_dec(&dst->__refcnt);
|
||||
}
|
||||
}
|
||||
extern void dst_release(struct dst_entry *dst);
|
||||
|
||||
/* Children define the path of the packet through the
|
||||
* Linux networking. Thus, destinations are stackable.
|
||||
|
||||
@@ -87,6 +87,7 @@ static inline void fib_rule_get(struct fib_rule *rule)
|
||||
static inline void fib_rule_put_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct fib_rule *rule = container_of(head, struct fib_rule, rcu);
|
||||
release_net(rule->fr_net);
|
||||
kfree(rule);
|
||||
}
|
||||
|
||||
|
||||
+1
-8
@@ -48,7 +48,7 @@ struct sk_buff;
|
||||
extern void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info);
|
||||
extern int icmp_rcv(struct sk_buff *skb);
|
||||
extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
||||
extern void icmp_init(struct net_proto_family *ops);
|
||||
extern int icmp_init(void);
|
||||
extern void icmp_out_count(unsigned char type);
|
||||
|
||||
/* Move into dst.h ? */
|
||||
@@ -65,11 +65,4 @@ static inline struct raw_sock *raw_sk(const struct sock *sk)
|
||||
return (struct raw_sock *)sk;
|
||||
}
|
||||
|
||||
extern int sysctl_icmp_echo_ignore_all;
|
||||
extern int sysctl_icmp_echo_ignore_broadcasts;
|
||||
extern int sysctl_icmp_ignore_bogus_error_responses;
|
||||
extern int sysctl_icmp_errors_use_inbound_ifaddr;
|
||||
extern int sysctl_icmp_ratelimit;
|
||||
extern int sysctl_icmp_ratemask;
|
||||
|
||||
#endif /* _ICMP_H */
|
||||
|
||||
@@ -183,7 +183,6 @@ const char *escape_essid(const char *essid, u8 essid_len);
|
||||
#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a)
|
||||
#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a)
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/if_arp.h> /* ARPHRD_ETHER */
|
||||
|
||||
#ifndef WIRELESS_SPY
|
||||
|
||||
@@ -1,373 +0,0 @@
|
||||
/*
|
||||
* ieee80211softmac.h - public interface to the softmac
|
||||
*
|
||||
* Copyright (c) 2005 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Joseph Jezak <josejx@gentoo.org>
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
* Danny van Dyk <kugelfang@gentoo.org>
|
||||
* Michael Buesch <mbuesch@freenet.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called COPYING.
|
||||
*/
|
||||
|
||||
#ifndef IEEE80211SOFTMAC_H_
|
||||
#define IEEE80211SOFTMAC_H_
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/list.h>
|
||||
#include <net/ieee80211.h>
|
||||
|
||||
/* Once the API is considered more or less stable,
|
||||
* this should be incremented on API incompatible changes.
|
||||
*/
|
||||
#define IEEE80211SOFTMAC_API 0
|
||||
|
||||
#define IEEE80211SOFTMAC_MAX_RATES_LEN 8
|
||||
#define IEEE80211SOFTMAC_MAX_EX_RATES_LEN 255
|
||||
|
||||
struct ieee80211softmac_ratesinfo {
|
||||
u8 count;
|
||||
u8 rates[IEEE80211SOFTMAC_MAX_RATES_LEN + IEEE80211SOFTMAC_MAX_EX_RATES_LEN];
|
||||
};
|
||||
|
||||
/* internal structures */
|
||||
struct ieee80211softmac_network;
|
||||
struct ieee80211softmac_scaninfo;
|
||||
|
||||
struct ieee80211softmac_essid {
|
||||
u8 len;
|
||||
char data[IW_ESSID_MAX_SIZE+1];
|
||||
};
|
||||
|
||||
struct ieee80211softmac_wpa {
|
||||
char *IE;
|
||||
int IElen;
|
||||
int IEbuflen;
|
||||
};
|
||||
|
||||
/*
|
||||
* Information about association
|
||||
*/
|
||||
struct ieee80211softmac_assoc_info {
|
||||
|
||||
struct mutex mutex;
|
||||
|
||||
/*
|
||||
* This is the requested ESSID. It is written
|
||||
* only by the WX handlers.
|
||||
*
|
||||
*/
|
||||
struct ieee80211softmac_essid req_essid;
|
||||
/*
|
||||
* the ESSID of the network we're currently
|
||||
* associated (or trying) to. This is
|
||||
* updated to the network's actual ESSID
|
||||
* even if the requested ESSID was 'ANY'
|
||||
*/
|
||||
struct ieee80211softmac_essid associate_essid;
|
||||
|
||||
/* BSSID we're trying to associate to */
|
||||
char bssid[ETH_ALEN];
|
||||
|
||||
/* some flags.
|
||||
* static_essid is valid if the essid is constant,
|
||||
* this is for use by the wx handlers only.
|
||||
*
|
||||
* associating is true, if the network has been
|
||||
* auth'ed on and we are in the process of associating.
|
||||
*
|
||||
* bssvalid is true if we found a matching network
|
||||
* and saved it's BSSID into the bssid above.
|
||||
*
|
||||
* bssfixed is used for SIOCSIWAP.
|
||||
*/
|
||||
u8 static_essid;
|
||||
u8 short_preamble_available;
|
||||
u8 associating;
|
||||
u8 associated;
|
||||
u8 assoc_wait;
|
||||
u8 bssvalid;
|
||||
u8 bssfixed;
|
||||
|
||||
/* Scan retries remaining */
|
||||
int scan_retry;
|
||||
|
||||
struct delayed_work work;
|
||||
struct delayed_work timeout;
|
||||
};
|
||||
|
||||
struct ieee80211softmac_bss_info {
|
||||
/* Rates supported by the network */
|
||||
struct ieee80211softmac_ratesinfo supported_rates;
|
||||
|
||||
/* This indicates whether frames can currently be transmitted with
|
||||
* short preamble (only use this variable during TX at CCK rates) */
|
||||
u8 short_preamble:1;
|
||||
|
||||
/* This indicates whether protection (e.g. self-CTS) should be used
|
||||
* when transmitting with OFDM modulation */
|
||||
u8 use_protection:1;
|
||||
};
|
||||
|
||||
enum {
|
||||
IEEE80211SOFTMAC_AUTH_OPEN_REQUEST = 1,
|
||||
IEEE80211SOFTMAC_AUTH_OPEN_RESPONSE = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
IEEE80211SOFTMAC_AUTH_SHARED_REQUEST = 1,
|
||||
IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE = 2,
|
||||
IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE = 3,
|
||||
IEEE80211SOFTMAC_AUTH_SHARED_PASS = 4,
|
||||
};
|
||||
|
||||
/* We should make these tunable
|
||||
* AUTH_TIMEOUT seems really long, but that's what it is in BSD */
|
||||
#define IEEE80211SOFTMAC_AUTH_TIMEOUT (12 * HZ)
|
||||
#define IEEE80211SOFTMAC_AUTH_RETRY_LIMIT 5
|
||||
#define IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT 3
|
||||
|
||||
struct ieee80211softmac_txrates {
|
||||
/* The Bit-Rate to be used for multicast frames. */
|
||||
u8 mcast_rate;
|
||||
|
||||
/* The Bit-Rate to be used for multicast management frames. */
|
||||
u8 mgt_mcast_rate;
|
||||
|
||||
/* The Bit-Rate to be used for any other (normal) data packet. */
|
||||
u8 default_rate;
|
||||
/* The Bit-Rate to be used for default fallback
|
||||
* (If the device supports fallback and hardware-retry)
|
||||
*/
|
||||
u8 default_fallback;
|
||||
|
||||
/* This is the rate that the user asked for */
|
||||
u8 user_rate;
|
||||
};
|
||||
|
||||
/* Bits for txrates_change callback. */
|
||||
#define IEEE80211SOFTMAC_TXRATECHG_DEFAULT (1 << 0) /* default_rate */
|
||||
#define IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK (1 << 1) /* default_fallback */
|
||||
#define IEEE80211SOFTMAC_TXRATECHG_MCAST (1 << 2) /* mcast_rate */
|
||||
#define IEEE80211SOFTMAC_TXRATECHG_MGT_MCAST (1 << 3) /* mgt_mcast_rate */
|
||||
|
||||
#define IEEE80211SOFTMAC_BSSINFOCHG_RATES (1 << 0) /* supported_rates */
|
||||
#define IEEE80211SOFTMAC_BSSINFOCHG_SHORT_PREAMBLE (1 << 1) /* short_preamble */
|
||||
#define IEEE80211SOFTMAC_BSSINFOCHG_PROTECTION (1 << 2) /* use_protection */
|
||||
|
||||
struct ieee80211softmac_device {
|
||||
/* 802.11 structure for data stuff */
|
||||
struct ieee80211_device *ieee;
|
||||
struct net_device *dev;
|
||||
|
||||
/* only valid if associated, then holds the Association ID */
|
||||
u16 association_id;
|
||||
|
||||
/* the following methods are callbacks that the driver
|
||||
* using this framework has to assign
|
||||
*/
|
||||
|
||||
/* always assign these */
|
||||
void (*set_bssid_filter)(struct net_device *dev, const u8 *bssid);
|
||||
void (*set_channel)(struct net_device *dev, u8 channel);
|
||||
|
||||
/* assign if you need it, informational only */
|
||||
void (*link_change)(struct net_device *dev);
|
||||
|
||||
/* If the hardware can do scanning, assign _all_ three of these callbacks.
|
||||
* When the scan finishes, call ieee80211softmac_scan_finished().
|
||||
*/
|
||||
|
||||
/* when called, start_scan is guaranteed to not be called again
|
||||
* until you call ieee80211softmac_scan_finished.
|
||||
* Return 0 if scanning could start, error otherwise.
|
||||
* SOFTMAC AUTHORS: don't call this, use ieee80211softmac_start_scan */
|
||||
int (*start_scan)(struct net_device *dev);
|
||||
/* this should block until after ieee80211softmac_scan_finished was called
|
||||
* SOFTMAC AUTHORS: don't call this, use ieee80211softmac_wait_for_scan */
|
||||
void (*wait_for_scan)(struct net_device *dev);
|
||||
/* stop_scan aborts a scan, but is asynchronous.
|
||||
* if you want to wait for it too, use wait_for_scan
|
||||
* SOFTMAC AUTHORS: don't call this, use ieee80211softmac_stop_scan */
|
||||
void (*stop_scan)(struct net_device *dev);
|
||||
|
||||
/* we'll need something about beacons here too, for AP or ad-hoc modes */
|
||||
|
||||
/* Transmission rates to be used by the driver.
|
||||
* The SoftMAC figures out the best possible rates.
|
||||
* The driver just needs to read them.
|
||||
*/
|
||||
struct ieee80211softmac_txrates txrates;
|
||||
|
||||
/* If the driver needs to do stuff on TX rate changes, assign this
|
||||
* callback. See IEEE80211SOFTMAC_TXRATECHG for change flags. */
|
||||
void (*txrates_change)(struct net_device *dev,
|
||||
u32 changes);
|
||||
|
||||
/* If the driver needs to do stuff when BSS properties change, assign
|
||||
* this callback. see IEEE80211SOFTMAC_BSSINFOCHG for change flags. */
|
||||
void (*bssinfo_change)(struct net_device *dev,
|
||||
u32 changes);
|
||||
|
||||
/* private stuff follows */
|
||||
/* this lock protects this structure */
|
||||
spinlock_t lock;
|
||||
|
||||
struct workqueue_struct *wq;
|
||||
|
||||
u8 running; /* SoftMAC started? */
|
||||
u8 scanning;
|
||||
|
||||
struct ieee80211softmac_scaninfo *scaninfo;
|
||||
struct ieee80211softmac_assoc_info associnfo;
|
||||
struct ieee80211softmac_bss_info bssinfo;
|
||||
|
||||
struct list_head auth_queue;
|
||||
struct list_head events;
|
||||
|
||||
struct ieee80211softmac_ratesinfo ratesinfo;
|
||||
int txrate_badness;
|
||||
|
||||
/* WPA stuff */
|
||||
struct ieee80211softmac_wpa wpa;
|
||||
|
||||
/* we need to keep a list of network structs we copied */
|
||||
struct list_head network_list;
|
||||
|
||||
/* This must be the last item so that it points to the data
|
||||
* allocated beyond this structure by alloc_ieee80211 */
|
||||
u8 priv[0];
|
||||
};
|
||||
|
||||
extern void ieee80211softmac_scan_finished(struct ieee80211softmac_device *sm);
|
||||
|
||||
static inline void * ieee80211softmac_priv(struct net_device *dev)
|
||||
{
|
||||
return ((struct ieee80211softmac_device *)ieee80211_priv(dev))->priv;
|
||||
}
|
||||
|
||||
extern struct net_device * alloc_ieee80211softmac(int sizeof_priv);
|
||||
extern void free_ieee80211softmac(struct net_device *dev);
|
||||
|
||||
/* Call this function if you detect a lost TX fragment.
|
||||
* (If the device indicates failure of ACK RX, for example.)
|
||||
* It is wise to call this function if you are able to detect lost packets,
|
||||
* because it contributes to the TX Rates auto adjustment.
|
||||
*/
|
||||
extern void ieee80211softmac_fragment_lost(struct net_device *dev,
|
||||
u16 wireless_sequence_number);
|
||||
/* Call this function before _start to tell the softmac what rates
|
||||
* the hw supports. The rates parameter is copied, so you can
|
||||
* free it right after calling this function.
|
||||
* Note that the rates need to be sorted. */
|
||||
extern void ieee80211softmac_set_rates(struct net_device *dev, u8 count, u8 *rates);
|
||||
|
||||
/* Finds the highest rate which is:
|
||||
* 1. Present in ri (optionally a basic rate)
|
||||
* 2. Supported by the device
|
||||
* 3. Less than or equal to the user-defined rate
|
||||
*/
|
||||
extern u8 ieee80211softmac_highest_supported_rate(struct ieee80211softmac_device *mac,
|
||||
struct ieee80211softmac_ratesinfo *ri, int basic_only);
|
||||
|
||||
/* Helper function which advises you the rate at which a frame should be
|
||||
* transmitted at. */
|
||||
static inline u8 ieee80211softmac_suggest_txrate(struct ieee80211softmac_device *mac,
|
||||
int is_multicast,
|
||||
int is_mgt)
|
||||
{
|
||||
struct ieee80211softmac_txrates *txrates = &mac->txrates;
|
||||
|
||||
if (!mac->associnfo.associated)
|
||||
return txrates->mgt_mcast_rate;
|
||||
|
||||
/* We are associated, sending unicast frame */
|
||||
if (!is_multicast)
|
||||
return txrates->default_rate;
|
||||
|
||||
/* We are associated, sending multicast frame */
|
||||
if (is_mgt)
|
||||
return txrates->mgt_mcast_rate;
|
||||
else
|
||||
return txrates->mcast_rate;
|
||||
}
|
||||
|
||||
/* Helper function which advises you when it is safe to transmit with short
|
||||
* preamble.
|
||||
* You should only call this function when transmitting at CCK rates. */
|
||||
static inline int ieee80211softmac_short_preamble_ok(struct ieee80211softmac_device *mac,
|
||||
int is_multicast,
|
||||
int is_mgt)
|
||||
{
|
||||
return (is_multicast && is_mgt) ? 0 : mac->bssinfo.short_preamble;
|
||||
}
|
||||
|
||||
/* Helper function which advises you whether protection (e.g. self-CTS) is
|
||||
* needed. 1 = protection needed, 0 = no protection needed
|
||||
* Only use this function when transmitting with OFDM modulation. */
|
||||
static inline int ieee80211softmac_protection_needed(struct ieee80211softmac_device *mac)
|
||||
{
|
||||
return mac->bssinfo.use_protection;
|
||||
}
|
||||
|
||||
/* Start the SoftMAC. Call this after you initialized the device
|
||||
* and it is ready to run.
|
||||
*/
|
||||
extern void ieee80211softmac_start(struct net_device *dev);
|
||||
/* Stop the SoftMAC. Call this before you shutdown the device. */
|
||||
extern void ieee80211softmac_stop(struct net_device *dev);
|
||||
|
||||
/*
|
||||
* Event system
|
||||
*/
|
||||
|
||||
/* valid event types */
|
||||
#define IEEE80211SOFTMAC_EVENT_ANY -1 /*private use only*/
|
||||
#define IEEE80211SOFTMAC_EVENT_SCAN_FINISHED 0
|
||||
#define IEEE80211SOFTMAC_EVENT_ASSOCIATED 1
|
||||
#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED 2
|
||||
#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT 3
|
||||
#define IEEE80211SOFTMAC_EVENT_AUTHENTICATED 4
|
||||
#define IEEE80211SOFTMAC_EVENT_AUTH_FAILED 5
|
||||
#define IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT 6
|
||||
#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND 7
|
||||
#define IEEE80211SOFTMAC_EVENT_DISASSOCIATED 8
|
||||
/* keep this updated! */
|
||||
#define IEEE80211SOFTMAC_EVENT_LAST 8
|
||||
/*
|
||||
* If you want to be notified of certain events, you can call
|
||||
* ieee80211softmac_notify[_atomic] with
|
||||
* - event set to one of the constants below
|
||||
* - fun set to a function pointer of the appropriate type
|
||||
* - context set to the context data you want passed
|
||||
* The return value is 0, or an error.
|
||||
*/
|
||||
typedef void (*notify_function_ptr)(struct net_device *dev, int event_type, void *context);
|
||||
|
||||
#define ieee80211softmac_notify(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_KERNEL);
|
||||
#define ieee80211softmac_notify_atomic(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_ATOMIC);
|
||||
|
||||
extern int ieee80211softmac_notify_gfp(struct net_device *dev,
|
||||
int event, notify_function_ptr fun, void *context, gfp_t gfp_mask);
|
||||
|
||||
/* To clear pending work (for ifconfig down, etc.) */
|
||||
extern void
|
||||
ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm);
|
||||
|
||||
#endif /* IEEE80211SOFTMAC_H_ */
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
* This file contains the prototypes for the wireless extension
|
||||
* handlers that the softmac API provides. Include this file to
|
||||
* use the wx handlers, you can assign these directly.
|
||||
*
|
||||
* Copyright (c) 2005 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Joseph Jezak <josejx@gentoo.org>
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
* Danny van Dyk <kugelfang@gentoo.org>
|
||||
* Michael Buesch <mbuesch@freenet.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called COPYING.
|
||||
*/
|
||||
|
||||
#ifndef _IEEE80211SOFTMAC_WX_H
|
||||
#define _IEEE80211SOFTMAC_WX_H
|
||||
|
||||
#include <net/ieee80211softmac.h>
|
||||
#include <net/iw_handler.h>
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_trigger_scan(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_get_scan_results(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_set_essid(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_get_essid(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_set_rate(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_get_rate(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_get_wap(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_set_wap(struct net_device *net_dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *data,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_set_genie(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra);
|
||||
|
||||
extern int
|
||||
ieee80211softmac_wx_get_genie(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra);
|
||||
extern int
|
||||
ieee80211softmac_wx_set_mlme(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra);
|
||||
#endif /* _IEEE80211SOFTMAC_WX */
|
||||
@@ -39,6 +39,17 @@ extern int inet_getname(struct socket *sock,
|
||||
extern int inet_ioctl(struct socket *sock,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
extern int inet_ctl_sock_create(struct sock **sk,
|
||||
unsigned short family,
|
||||
unsigned short type,
|
||||
unsigned char protocol,
|
||||
struct net *net);
|
||||
|
||||
static inline void inet_ctl_sock_destroy(struct sock *sk)
|
||||
{
|
||||
sk_release_kernel(sk);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -327,11 +327,6 @@ extern void inet_csk_listen_stop(struct sock *sk);
|
||||
|
||||
extern void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
|
||||
extern int inet_csk_ctl_sock_create(struct socket **sock,
|
||||
unsigned short family,
|
||||
unsigned short type,
|
||||
unsigned char protocol);
|
||||
|
||||
extern int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
|
||||
|
||||
@@ -25,9 +25,9 @@ struct inet_frag_queue {
|
||||
int meat;
|
||||
__u8 last_in; /* first/last segment arrived? */
|
||||
|
||||
#define COMPLETE 4
|
||||
#define FIRST_IN 2
|
||||
#define LAST_IN 1
|
||||
#define INET_FRAG_COMPLETE 4
|
||||
#define INET_FRAG_FIRST_IN 2
|
||||
#define INET_FRAG_LAST_IN 1
|
||||
};
|
||||
|
||||
#define INETFRAGS_HASHSZ 64
|
||||
|
||||
@@ -221,26 +221,7 @@ static inline int inet_sk_listen_hashfn(const struct sock *sk)
|
||||
}
|
||||
|
||||
/* Caller must disable local BH processing. */
|
||||
static inline void __inet_inherit_port(struct sock *sk, struct sock *child)
|
||||
{
|
||||
struct inet_hashinfo *table = sk->sk_prot->hashinfo;
|
||||
const int bhash = inet_bhashfn(inet_sk(child)->num, table->bhash_size);
|
||||
struct inet_bind_hashbucket *head = &table->bhash[bhash];
|
||||
struct inet_bind_bucket *tb;
|
||||
|
||||
spin_lock(&head->lock);
|
||||
tb = inet_csk(sk)->icsk_bind_hash;
|
||||
sk_add_bind_node(child, &tb->owners);
|
||||
inet_csk(child)->icsk_bind_hash = tb;
|
||||
spin_unlock(&head->lock);
|
||||
}
|
||||
|
||||
static inline void inet_inherit_port(struct sock *sk, struct sock *child)
|
||||
{
|
||||
local_bh_disable();
|
||||
__inet_inherit_port(sk, child);
|
||||
local_bh_enable();
|
||||
}
|
||||
extern void __inet_inherit_port(struct sock *sk, struct sock *child);
|
||||
|
||||
extern void inet_put_port(struct sock *sk);
|
||||
|
||||
@@ -314,25 +295,25 @@ typedef __u64 __bitwise __addrpair;
|
||||
((__force __u64)(__be32)(__saddr)));
|
||||
#endif /* __BIG_ENDIAN */
|
||||
#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
((*((__addrpair *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#define INET_TW_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
((*((__addrpair *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \
|
||||
((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#else /* 32-bit arch */
|
||||
#define INET_ADDR_COOKIE(__name, __saddr, __daddr)
|
||||
#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif) \
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
(inet_sk(__sk)->daddr == (__saddr)) && \
|
||||
(inet_sk(__sk)->rcv_saddr == (__daddr)) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#define INET_TW_MATCH(__sk, __net, __hash,__cookie, __saddr, __daddr, __ports, __dif) \
|
||||
(((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \
|
||||
(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
|
||||
(inet_twsk(__sk)->tw_daddr == (__saddr)) && \
|
||||
(inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \
|
||||
((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
|
||||
@@ -43,8 +43,7 @@ struct ip_options {
|
||||
unsigned char srr;
|
||||
unsigned char rr;
|
||||
unsigned char ts;
|
||||
unsigned char is_data:1,
|
||||
is_strictroute:1,
|
||||
unsigned char is_strictroute:1,
|
||||
srr_is_hit:1,
|
||||
is_changed:1,
|
||||
rr_needaddr:1,
|
||||
@@ -137,7 +136,7 @@ struct inet_sock {
|
||||
unsigned int flags;
|
||||
unsigned int fragsize;
|
||||
struct ip_options *opt;
|
||||
struct rtable *rt;
|
||||
struct dst_entry *dst;
|
||||
int length; /* Total length of all frames */
|
||||
__be32 addr;
|
||||
struct flowi fl;
|
||||
@@ -195,7 +194,7 @@ static inline int inet_sk_ehashfn(const struct sock *sk)
|
||||
|
||||
static inline int inet_iif(const struct sk_buff *skb)
|
||||
{
|
||||
return ((struct rtable *)skb->dst)->rt_iif;
|
||||
return skb->rtable->rt_iif;
|
||||
}
|
||||
|
||||
#endif /* _INET_SOCK_H */
|
||||
|
||||
@@ -207,4 +207,22 @@ extern void inet_twsk_schedule(struct inet_timewait_sock *tw,
|
||||
const int timeo, const int timewait_len);
|
||||
extern void inet_twsk_deschedule(struct inet_timewait_sock *tw,
|
||||
struct inet_timewait_death_row *twdr);
|
||||
|
||||
static inline
|
||||
struct net *twsk_net(const struct inet_timewait_sock *twsk)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return twsk->tw_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
void twsk_net_set(struct inet_timewait_sock *twsk, struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
twsk->tw_net = net;
|
||||
#endif
|
||||
}
|
||||
#endif /* _INET_TIMEWAIT_SOCK_ */
|
||||
|
||||
+6
-4
@@ -347,10 +347,11 @@ extern int ip_forward(struct sk_buff *skb);
|
||||
extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag);
|
||||
extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
|
||||
extern void ip_options_fragment(struct sk_buff *skb);
|
||||
extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb);
|
||||
extern int ip_options_get(struct ip_options **optp,
|
||||
extern int ip_options_compile(struct net *net,
|
||||
struct ip_options *opt, struct sk_buff *skb);
|
||||
extern int ip_options_get(struct net *net, struct ip_options **optp,
|
||||
unsigned char *data, int optlen);
|
||||
extern int ip_options_get_from_user(struct ip_options **optp,
|
||||
extern int ip_options_get_from_user(struct net *net, struct ip_options **optp,
|
||||
unsigned char __user *data, int optlen);
|
||||
extern void ip_options_undo(struct ip_options * opt);
|
||||
extern void ip_forward_options(struct sk_buff *skb);
|
||||
@@ -361,7 +362,8 @@ extern int ip_options_rcv_srr(struct sk_buff *skb);
|
||||
*/
|
||||
|
||||
extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb);
|
||||
extern int ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc);
|
||||
extern int ip_cmsg_send(struct net *net,
|
||||
struct msghdr *msg, struct ipcm_cookie *ipc);
|
||||
extern int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int optlen);
|
||||
extern int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen);
|
||||
extern int compat_ip_setsockopt(struct sock *sk, int level,
|
||||
|
||||
+11
-7
@@ -174,17 +174,19 @@ struct fib6_table {
|
||||
#define RT6_TABLE_LOCAL RT6_TABLE_MAIN
|
||||
#endif
|
||||
|
||||
typedef struct rt6_info *(*pol_lookup_t)(struct fib6_table *,
|
||||
typedef struct rt6_info *(*pol_lookup_t)(struct net *,
|
||||
struct fib6_table *,
|
||||
struct flowi *, int);
|
||||
|
||||
/*
|
||||
* exported functions
|
||||
*/
|
||||
|
||||
extern struct fib6_table * fib6_get_table(u32 id);
|
||||
extern struct fib6_table * fib6_new_table(u32 id);
|
||||
extern struct dst_entry * fib6_rule_lookup(struct flowi *fl, int flags,
|
||||
pol_lookup_t lookup);
|
||||
extern struct fib6_table *fib6_get_table(struct net *net, u32 id);
|
||||
extern struct fib6_table *fib6_new_table(struct net *net, u32 id);
|
||||
extern struct dst_entry *fib6_rule_lookup(struct net *net,
|
||||
struct flowi *fl, int flags,
|
||||
pol_lookup_t lookup);
|
||||
|
||||
extern struct fib6_node *fib6_lookup(struct fib6_node *root,
|
||||
struct in6_addr *daddr,
|
||||
@@ -194,7 +196,8 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
|
||||
struct in6_addr *daddr, int dst_len,
|
||||
struct in6_addr *saddr, int src_len);
|
||||
|
||||
extern void fib6_clean_all(int (*func)(struct rt6_info *, void *arg),
|
||||
extern void fib6_clean_all(struct net *net,
|
||||
int (*func)(struct rt6_info *, void *arg),
|
||||
int prune, void *arg);
|
||||
|
||||
extern int fib6_add(struct fib6_node *root,
|
||||
@@ -207,7 +210,8 @@ extern int fib6_del(struct rt6_info *rt,
|
||||
extern void inet6_rt_notify(int event, struct rt6_info *rt,
|
||||
struct nl_info *info);
|
||||
|
||||
extern void fib6_run_gc(unsigned long dummy);
|
||||
extern void fib6_run_gc(unsigned long expires,
|
||||
struct net *net);
|
||||
|
||||
extern void fib6_gc_cleanup(void);
|
||||
|
||||
|
||||
+25
-31
@@ -30,60 +30,54 @@ struct route_info {
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
|
||||
#define RT6_LOOKUP_F_IFACE 0x1
|
||||
#define RT6_LOOKUP_F_REACHABLE 0x2
|
||||
#define RT6_LOOKUP_F_HAS_SADDR 0x4
|
||||
#define RT6_LOOKUP_F_IFACE 0x00000001
|
||||
#define RT6_LOOKUP_F_REACHABLE 0x00000002
|
||||
#define RT6_LOOKUP_F_HAS_SADDR 0x00000004
|
||||
#define RT6_LOOKUP_F_SRCPREF_TMP 0x00000008
|
||||
#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010
|
||||
#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020
|
||||
|
||||
extern struct rt6_info ip6_null_entry;
|
||||
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
extern struct rt6_info ip6_prohibit_entry;
|
||||
extern struct rt6_info ip6_blk_hole_entry;
|
||||
extern struct rt6_info *ip6_prohibit_entry;
|
||||
extern struct rt6_info *ip6_blk_hole_entry;
|
||||
#endif
|
||||
|
||||
extern void ip6_route_input(struct sk_buff *skb);
|
||||
|
||||
extern struct dst_entry * ip6_route_output(struct sock *sk,
|
||||
extern struct dst_entry * ip6_route_output(struct net *net,
|
||||
struct sock *sk,
|
||||
struct flowi *fl);
|
||||
|
||||
extern int ip6_route_init(void);
|
||||
extern void ip6_route_cleanup(void);
|
||||
|
||||
extern int ipv6_route_ioctl(unsigned int cmd, void __user *arg);
|
||||
extern int ipv6_route_ioctl(struct net *net,
|
||||
unsigned int cmd,
|
||||
void __user *arg);
|
||||
|
||||
extern int ip6_route_add(struct fib6_config *cfg);
|
||||
extern int ip6_ins_rt(struct rt6_info *);
|
||||
extern int ip6_del_rt(struct rt6_info *);
|
||||
|
||||
extern int ip6_rt_addr_add(struct in6_addr *addr,
|
||||
struct net_device *dev,
|
||||
int anycast);
|
||||
|
||||
extern int ip6_rt_addr_del(struct in6_addr *addr,
|
||||
struct net_device *dev);
|
||||
|
||||
extern void rt6_sndmsg(int type, struct in6_addr *dst,
|
||||
struct in6_addr *src,
|
||||
struct in6_addr *gw,
|
||||
struct net_device *dev,
|
||||
int dstlen, int srclen,
|
||||
int metric, __u32 flags);
|
||||
|
||||
extern struct rt6_info *rt6_lookup(struct in6_addr *daddr,
|
||||
struct in6_addr *saddr,
|
||||
extern struct rt6_info *rt6_lookup(struct net *net,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr,
|
||||
int oif, int flags);
|
||||
|
||||
extern struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
|
||||
extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
|
||||
struct neighbour *neigh,
|
||||
struct in6_addr *addr,
|
||||
int (*output)(struct sk_buff *));
|
||||
extern int ndisc_dst_gc(int *more);
|
||||
extern void fib6_force_start_gc(void);
|
||||
const struct in6_addr *addr);
|
||||
extern int icmp6_dst_gc(int *more);
|
||||
|
||||
extern void fib6_force_start_gc(struct net *net);
|
||||
|
||||
extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||
const struct in6_addr *addr,
|
||||
int anycast);
|
||||
|
||||
extern int ip6_dst_hoplimit(struct dst_entry *dst);
|
||||
|
||||
/*
|
||||
* support functions for ND
|
||||
*
|
||||
@@ -94,7 +88,7 @@ extern struct rt6_info * rt6_add_dflt_router(struct in6_addr *gwaddr,
|
||||
struct net_device *dev,
|
||||
unsigned int pref);
|
||||
|
||||
extern void rt6_purge_dflt_routers(void);
|
||||
extern void rt6_purge_dflt_routers(struct net *net);
|
||||
|
||||
extern int rt6_route_rcv(struct net_device *dev,
|
||||
u8 *opt, int len,
|
||||
@@ -121,7 +115,7 @@ struct rt6_rtnl_dump_arg
|
||||
};
|
||||
|
||||
extern int rt6_dump_route(struct rt6_info *rt, void *p_arg);
|
||||
extern void rt6_ifdown(struct net_device *dev);
|
||||
extern void rt6_ifdown(struct net *net, struct net_device *dev);
|
||||
extern void rt6_mtu_change(struct net_device *dev, unsigned mtu);
|
||||
|
||||
extern rwlock_t rt6_lock;
|
||||
|
||||
@@ -24,6 +24,16 @@ struct ip_tunnel
|
||||
int mlink;
|
||||
|
||||
struct ip_tunnel_parm parms;
|
||||
|
||||
struct ip_tunnel_prl_entry *prl; /* potential router list */
|
||||
unsigned int prl_count; /* # of entries in PRL */
|
||||
};
|
||||
|
||||
struct ip_tunnel_prl_entry
|
||||
{
|
||||
struct ip_tunnel_prl_entry *next;
|
||||
__be32 addr;
|
||||
u16 flags;
|
||||
};
|
||||
|
||||
#define IPTUNNEL_XMIT() do { \
|
||||
|
||||
+33
-51
@@ -202,6 +202,7 @@ struct ip6_flowlabel
|
||||
u32 owner;
|
||||
unsigned long lastuse;
|
||||
unsigned long expires;
|
||||
struct net *fl_net;
|
||||
};
|
||||
|
||||
#define IPV6_FLOWINFO_MASK __constant_htonl(0x0FFFFFFF)
|
||||
@@ -249,15 +250,6 @@ int ip6_frag_mem(struct net *net);
|
||||
|
||||
#define IPV6_FRAG_TIMEOUT (60*HZ) /* 60 seconds */
|
||||
|
||||
/*
|
||||
* Function prototype for build_xmit
|
||||
*/
|
||||
|
||||
typedef int (*inet_getfrag_t) (const void *data,
|
||||
struct in6_addr *addr,
|
||||
char *,
|
||||
unsigned int, unsigned int);
|
||||
|
||||
extern int __ipv6_addr_type(const struct in6_addr *addr);
|
||||
static inline int ipv6_addr_type(const struct in6_addr *addr)
|
||||
{
|
||||
@@ -288,12 +280,10 @@ static inline int
|
||||
ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
|
||||
const struct in6_addr *a2)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
if ((a1->s6_addr32[i] ^ a2->s6_addr32[i]) & m->s6_addr32[i])
|
||||
return 1;
|
||||
return 0;
|
||||
return (!!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
|
||||
((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
|
||||
((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
|
||||
((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3])));
|
||||
}
|
||||
|
||||
static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2)
|
||||
@@ -328,10 +318,10 @@ static inline void ipv6_addr_set(struct in6_addr *addr,
|
||||
static inline int ipv6_addr_equal(const struct in6_addr *a1,
|
||||
const struct in6_addr *a2)
|
||||
{
|
||||
return (a1->s6_addr32[0] == a2->s6_addr32[0] &&
|
||||
a1->s6_addr32[1] == a2->s6_addr32[1] &&
|
||||
a1->s6_addr32[2] == a2->s6_addr32[2] &&
|
||||
a1->s6_addr32[3] == a2->s6_addr32[3]);
|
||||
return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
|
||||
(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
|
||||
(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
|
||||
(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0);
|
||||
}
|
||||
|
||||
static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,
|
||||
@@ -379,8 +369,18 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
|
||||
|
||||
static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
|
||||
{
|
||||
return ((a->s6_addr32[0] | a->s6_addr32[1]) == 0 &&
|
||||
a->s6_addr32[2] == htonl(0x0000ffff));
|
||||
return ((a->s6_addr32[0] | a->s6_addr32[1] |
|
||||
(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a RFC 4843 ORCHID address
|
||||
* (Overlay Routable Cryptographic Hash Identifiers)
|
||||
*/
|
||||
static inline int ipv6_addr_orchid(const struct in6_addr *a)
|
||||
{
|
||||
return ((a->s6_addr32[0] & htonl(0xfffffff0))
|
||||
== htonl(0x20010010));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -451,8 +451,8 @@ extern int ip6_xmit(struct sock *sk,
|
||||
extern int ip6_nd_hdr(struct sock *sk,
|
||||
struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
struct in6_addr *saddr,
|
||||
struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr,
|
||||
const struct in6_addr *daddr,
|
||||
int proto, int len);
|
||||
|
||||
extern int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
|
||||
@@ -499,14 +499,6 @@ extern int ip6_local_out(struct sk_buff *skb);
|
||||
* Extension header (options) processing
|
||||
*/
|
||||
|
||||
extern u8 * ipv6_build_nfrag_opts(struct sk_buff *skb,
|
||||
u8 *prev_hdr,
|
||||
struct ipv6_txoptions *opt,
|
||||
struct in6_addr *daddr,
|
||||
u32 jumbolen);
|
||||
extern u8 * ipv6_build_frag_opts(struct sk_buff *skb,
|
||||
u8 *prev_hdr,
|
||||
struct ipv6_txoptions *opt);
|
||||
extern void ipv6_push_nfrag_opts(struct sk_buff *skb,
|
||||
struct ipv6_txoptions *opt,
|
||||
u8 *proto,
|
||||
@@ -545,10 +537,6 @@ extern int compat_ipv6_getsockopt(struct sock *sk,
|
||||
char __user *optval,
|
||||
int __user *optlen);
|
||||
|
||||
extern int ipv6_packet_init(void);
|
||||
|
||||
extern void ipv6_packet_cleanup(void);
|
||||
|
||||
extern int ip6_datagram_connect(struct sock *sk,
|
||||
struct sockaddr *addr, int addr_len);
|
||||
|
||||
@@ -585,14 +573,14 @@ extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
|
||||
int __user *optlen);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
extern int ac6_proc_init(void);
|
||||
extern void ac6_proc_exit(void);
|
||||
extern int ac6_proc_init(struct net *net);
|
||||
extern void ac6_proc_exit(struct net *net);
|
||||
extern int raw6_proc_init(void);
|
||||
extern void raw6_proc_exit(void);
|
||||
extern int tcp6_proc_init(void);
|
||||
extern void tcp6_proc_exit(void);
|
||||
extern int udp6_proc_init(void);
|
||||
extern void udp6_proc_exit(void);
|
||||
extern int tcp6_proc_init(struct net *net);
|
||||
extern void tcp6_proc_exit(struct net *net);
|
||||
extern int udp6_proc_init(struct net *net);
|
||||
extern void udp6_proc_exit(struct net *net);
|
||||
extern int udplite6_proc_init(void);
|
||||
extern void udplite6_proc_exit(void);
|
||||
extern int ipv6_misc_proc_init(void);
|
||||
@@ -600,17 +588,11 @@ extern void ipv6_misc_proc_exit(void);
|
||||
extern int snmp6_register_dev(struct inet6_dev *idev);
|
||||
extern int snmp6_unregister_dev(struct inet6_dev *idev);
|
||||
|
||||
extern struct rt6_statistics rt6_stats;
|
||||
#else
|
||||
static inline int snmp6_register_dev(struct inet6_dev *idev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int snmp6_unregister_dev(struct inet6_dev *idev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int ac6_proc_init(struct net *net) { return 0; }
|
||||
static inline void ac6_proc_exit(struct net *net) { }
|
||||
static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
|
||||
static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
||||
@@ -29,5 +29,4 @@ struct net_device *alloc_irlandev(const char *name);
|
||||
int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
|
||||
|
||||
void irlan_eth_flow_indication( void *instance, void *sap, LOCAL_FLOW flow);
|
||||
void irlan_eth_send_gratuitous_arp(struct net_device *dev);
|
||||
#endif
|
||||
|
||||
@@ -74,11 +74,6 @@ static inline int llc_mac_null(const u8 *mac)
|
||||
return is_zero_ether_addr(mac);
|
||||
}
|
||||
|
||||
static inline int llc_addrany(const struct llc_addr *addr)
|
||||
{
|
||||
return llc_mac_null(addr->mac) && !addr->lsap;
|
||||
}
|
||||
|
||||
static inline int llc_mac_multicast(const u8 *mac)
|
||||
{
|
||||
return is_multicast_ether_addr(mac);
|
||||
|
||||
+340
-218
@@ -38,7 +38,11 @@
|
||||
* called in hardware interrupt context. The low-level driver must not call any
|
||||
* other functions in hardware interrupt context. If there is a need for such
|
||||
* call, the low-level driver should first ACK the interrupt and perform the
|
||||
* IEEE 802.11 code call after this, e.g. from a scheduled workqueue function.
|
||||
* IEEE 802.11 code call after this, e.g. from a scheduled workqueue or even
|
||||
* tasklet function.
|
||||
*
|
||||
* NOTE: If the driver opts to use the _irqsafe() functions, it may not also
|
||||
* use the non-irqsafe functions!
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -69,93 +73,12 @@
|
||||
* not do so then mac80211 may add this under certain circumstances.
|
||||
*/
|
||||
|
||||
#define IEEE80211_CHAN_W_SCAN 0x00000001
|
||||
#define IEEE80211_CHAN_W_ACTIVE_SCAN 0x00000002
|
||||
#define IEEE80211_CHAN_W_IBSS 0x00000004
|
||||
|
||||
/* Channel information structure. Low-level driver is expected to fill in chan,
|
||||
* freq, and val fields. Other fields will be filled in by 80211.o based on
|
||||
* hostapd information and low-level driver does not need to use them. The
|
||||
* limits for each channel will be provided in 'struct ieee80211_conf' when
|
||||
* configuring the low-level driver with hw->config callback. If a device has
|
||||
* a default regulatory domain, IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED
|
||||
* can be set to let the driver configure all fields */
|
||||
struct ieee80211_channel {
|
||||
short chan; /* channel number (IEEE 802.11) */
|
||||
short freq; /* frequency in MHz */
|
||||
int val; /* hw specific value for the channel */
|
||||
int flag; /* flag for hostapd use (IEEE80211_CHAN_*) */
|
||||
unsigned char power_level;
|
||||
unsigned char antenna_max;
|
||||
};
|
||||
|
||||
#define IEEE80211_RATE_ERP 0x00000001
|
||||
#define IEEE80211_RATE_BASIC 0x00000002
|
||||
#define IEEE80211_RATE_PREAMBLE2 0x00000004
|
||||
#define IEEE80211_RATE_SUPPORTED 0x00000010
|
||||
#define IEEE80211_RATE_OFDM 0x00000020
|
||||
#define IEEE80211_RATE_CCK 0x00000040
|
||||
#define IEEE80211_RATE_MANDATORY 0x00000100
|
||||
|
||||
#define IEEE80211_RATE_CCK_2 (IEEE80211_RATE_CCK | IEEE80211_RATE_PREAMBLE2)
|
||||
#define IEEE80211_RATE_MODULATION(f) \
|
||||
(f & (IEEE80211_RATE_CCK | IEEE80211_RATE_OFDM))
|
||||
|
||||
/* Low-level driver should set PREAMBLE2, OFDM and CCK flags.
|
||||
* BASIC, SUPPORTED, ERP, and MANDATORY flags are set in 80211.o based on the
|
||||
* configuration. */
|
||||
struct ieee80211_rate {
|
||||
int rate; /* rate in 100 kbps */
|
||||
int val; /* hw specific value for the rate */
|
||||
int flags; /* IEEE80211_RATE_ flags */
|
||||
int val2; /* hw specific value for the rate when using short preamble
|
||||
* (only when IEEE80211_RATE_PREAMBLE2 flag is set, i.e., for
|
||||
* 2, 5.5, and 11 Mbps) */
|
||||
signed char min_rssi_ack;
|
||||
unsigned char min_rssi_ack_delta;
|
||||
|
||||
/* following fields are set by 80211.o and need not be filled by the
|
||||
* low-level driver */
|
||||
int rate_inv; /* inverse of the rate (LCM(all rates) / rate) for
|
||||
* optimizing channel utilization estimates */
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_phymode - PHY modes
|
||||
*
|
||||
* @MODE_IEEE80211A: 5GHz as defined by 802.11a/802.11h
|
||||
* @MODE_IEEE80211B: 2.4 GHz as defined by 802.11b
|
||||
* @MODE_IEEE80211G: 2.4 GHz as defined by 802.11g (with OFDM),
|
||||
* backwards compatible with 11b mode
|
||||
* @NUM_IEEE80211_MODES: internal
|
||||
* enum ieee80211_notification_type - Low level driver notification
|
||||
* @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence
|
||||
*/
|
||||
enum ieee80211_phymode {
|
||||
MODE_IEEE80211A,
|
||||
MODE_IEEE80211B,
|
||||
MODE_IEEE80211G,
|
||||
|
||||
/* keep last */
|
||||
NUM_IEEE80211_MODES
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_ht_info - describing STA's HT capabilities
|
||||
*
|
||||
* This structure describes most essential parameters needed
|
||||
* to describe 802.11n HT capabilities for an STA.
|
||||
*
|
||||
* @ht_supported: is HT supported by STA, 0: no, 1: yes
|
||||
* @cap: HT capabilities map as described in 802.11n spec
|
||||
* @ampdu_factor: Maximum A-MPDU length factor
|
||||
* @ampdu_density: Minimum A-MPDU spacing
|
||||
* @supp_mcs_set: Supported MCS set as described in 802.11n spec
|
||||
*/
|
||||
struct ieee80211_ht_info {
|
||||
u8 ht_supported;
|
||||
u16 cap; /* use IEEE80211_HT_CAP_ */
|
||||
u8 ampdu_factor;
|
||||
u8 ampdu_density;
|
||||
u8 supp_mcs_set[16];
|
||||
enum ieee80211_notification_types {
|
||||
IEEE80211_NOTIFY_RE_ASSOC,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -174,47 +97,23 @@ struct ieee80211_ht_bss_info {
|
||||
u8 bss_op_mode; /* use IEEE80211_HT_IE_ */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_hw_mode - PHY mode definition
|
||||
*
|
||||
* This structure describes the capabilities supported by the device
|
||||
* in a single PHY mode.
|
||||
*
|
||||
* @list: internal
|
||||
* @channels: pointer to array of supported channels
|
||||
* @rates: pointer to array of supported bitrates
|
||||
* @mode: the PHY mode for this definition
|
||||
* @num_channels: number of supported channels
|
||||
* @num_rates: number of supported bitrates
|
||||
* @ht_info: PHY's 802.11n HT abilities for this mode
|
||||
*/
|
||||
struct ieee80211_hw_mode {
|
||||
struct list_head list;
|
||||
struct ieee80211_channel *channels;
|
||||
struct ieee80211_rate *rates;
|
||||
enum ieee80211_phymode mode;
|
||||
int num_channels;
|
||||
int num_rates;
|
||||
struct ieee80211_ht_info ht_info;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_tx_queue_params - transmit queue configuration
|
||||
*
|
||||
* The information provided in this structure is required for QoS
|
||||
* transmit queue configuration.
|
||||
* transmit queue configuration. Cf. IEEE 802.11 7.3.2.29.
|
||||
*
|
||||
* @aifs: arbitration interface space [0..255, -1: use default]
|
||||
* @cw_min: minimum contention window [will be a value of the form
|
||||
* 2^n-1 in the range 1..1023; 0: use default]
|
||||
* @cw_max: maximum contention window [like @cw_min]
|
||||
* @burst_time: maximum burst time in units of 0.1ms, 0 meaning disabled
|
||||
* @txop: maximum burst time in units of 32 usecs, 0 meaning disabled
|
||||
*/
|
||||
struct ieee80211_tx_queue_params {
|
||||
int aifs;
|
||||
int cw_min;
|
||||
int cw_max;
|
||||
int burst_time;
|
||||
s16 aifs;
|
||||
u16 cw_min;
|
||||
u16 cw_max;
|
||||
u16 txop;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -246,6 +145,7 @@ struct ieee80211_tx_queue_stats_data {
|
||||
* @IEEE80211_TX_QUEUE_AFTER_BEACON: transmit queue for frames to be
|
||||
* sent after a beacon
|
||||
* @IEEE80211_TX_QUEUE_BEACON: transmit queue for beacon frames
|
||||
* @NUM_TX_DATA_QUEUES_AMPDU: adding more queues for A-MPDU
|
||||
*/
|
||||
enum ieee80211_tx_queue {
|
||||
IEEE80211_TX_QUEUE_DATA0,
|
||||
@@ -261,11 +161,12 @@ enum ieee80211_tx_queue {
|
||||
* this struct need to have fixed values. As soon as it is removed, we can
|
||||
* fix these entries. */
|
||||
IEEE80211_TX_QUEUE_AFTER_BEACON = 6,
|
||||
IEEE80211_TX_QUEUE_BEACON = 7
|
||||
IEEE80211_TX_QUEUE_BEACON = 7,
|
||||
NUM_TX_DATA_QUEUES_AMPDU = 16
|
||||
};
|
||||
|
||||
struct ieee80211_tx_queue_stats {
|
||||
struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES];
|
||||
struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES_AMPDU];
|
||||
};
|
||||
|
||||
struct ieee80211_low_level_stats {
|
||||
@@ -285,11 +186,13 @@ struct ieee80211_low_level_stats {
|
||||
* also implies a change in the AID.
|
||||
* @BSS_CHANGED_ERP_CTS_PROT: CTS protection changed
|
||||
* @BSS_CHANGED_ERP_PREAMBLE: preamble changed
|
||||
* @BSS_CHANGED_HT: 802.11n parameters changed
|
||||
*/
|
||||
enum ieee80211_bss_change {
|
||||
BSS_CHANGED_ASSOC = 1<<0,
|
||||
BSS_CHANGED_ERP_CTS_PROT = 1<<1,
|
||||
BSS_CHANGED_ERP_PREAMBLE = 1<<2,
|
||||
BSS_CHANGED_HT = 1<<4,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -302,6 +205,12 @@ enum ieee80211_bss_change {
|
||||
* @aid: association ID number, valid only when @assoc is true
|
||||
* @use_cts_prot: use CTS protection
|
||||
* @use_short_preamble: use 802.11b short preamble
|
||||
* @timestamp: beacon timestamp
|
||||
* @beacon_int: beacon interval
|
||||
* @assoc_capability: capabbilities taken from assoc resp
|
||||
* @assoc_ht: association in HT mode
|
||||
* @ht_conf: ht capabilities
|
||||
* @ht_bss_conf: ht extended capabilities
|
||||
*/
|
||||
struct ieee80211_bss_conf {
|
||||
/* association related data */
|
||||
@@ -310,6 +219,69 @@ struct ieee80211_bss_conf {
|
||||
/* erp related data */
|
||||
bool use_cts_prot;
|
||||
bool use_short_preamble;
|
||||
u16 beacon_int;
|
||||
u16 assoc_capability;
|
||||
u64 timestamp;
|
||||
/* ht related data */
|
||||
bool assoc_ht;
|
||||
struct ieee80211_ht_info *ht_conf;
|
||||
struct ieee80211_ht_bss_info *ht_bss_conf;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mac80211_tx_control_flags - flags to describe Tx configuration for
|
||||
* the Tx frame
|
||||
*
|
||||
* These flags are used with the @flags member of &ieee80211_tx_control
|
||||
*
|
||||
* @IEEE80211_TXCTL_REQ_TX_STATUS: request TX status callback for this frame.
|
||||
* @IEEE80211_TXCTL_DO_NOT_ENCRYPT: send this frame without encryption;
|
||||
* e.g., for EAPOL frame
|
||||
* @IEEE80211_TXCTL_USE_RTS_CTS: use RTS-CTS before sending frame
|
||||
* @IEEE80211_TXCTL_USE_CTS_PROTECT: use CTS protection for the frame (e.g.,
|
||||
* for combined 802.11g / 802.11b networks)
|
||||
* @IEEE80211_TXCTL_NO_ACK: tell the low level not to wait for an ack
|
||||
* @IEEE80211_TXCTL_RATE_CTRL_PROBE
|
||||
* @EEE80211_TXCTL_CLEAR_PS_FILT: clear powersave filter
|
||||
* for destination station
|
||||
* @IEEE80211_TXCTL_REQUEUE:
|
||||
* @IEEE80211_TXCTL_FIRST_FRAGMENT: this is a first fragment of the frame
|
||||
* @IEEE80211_TXCTL_LONG_RETRY_LIMIT: this frame should be send using the
|
||||
* through set_retry_limit configured long
|
||||
* retry value
|
||||
* @IEEE80211_TXCTL_EAPOL_FRAME: internal to mac80211
|
||||
* @IEEE80211_TXCTL_SEND_AFTER_DTIM: send this frame after DTIM beacon
|
||||
* @IEEE80211_TXCTL_AMPDU: this frame should be sent as part of an A-MPDU
|
||||
* @IEEE80211_TXCTL_OFDM_HT: this frame can be sent in HT OFDM rates. number
|
||||
* of streams when this flag is on can be extracted
|
||||
* from antenna_sel_tx, so if 1 antenna is marked
|
||||
* use SISO, 2 antennas marked use MIMO, n antennas
|
||||
* marked use MIMO_n.
|
||||
* @IEEE80211_TXCTL_GREEN_FIELD: use green field protection for this frame
|
||||
* @IEEE80211_TXCTL_40_MHZ_WIDTH: send this frame using 40 Mhz channel width
|
||||
* @IEEE80211_TXCTL_DUP_DATA: duplicate data frame on both 20 Mhz channels
|
||||
* @IEEE80211_TXCTL_SHORT_GI: send this frame using short guard interval
|
||||
*/
|
||||
enum mac80211_tx_control_flags {
|
||||
IEEE80211_TXCTL_REQ_TX_STATUS = (1<<0),
|
||||
IEEE80211_TXCTL_DO_NOT_ENCRYPT = (1<<1),
|
||||
IEEE80211_TXCTL_USE_RTS_CTS = (1<<2),
|
||||
IEEE80211_TXCTL_USE_CTS_PROTECT = (1<<3),
|
||||
IEEE80211_TXCTL_NO_ACK = (1<<4),
|
||||
IEEE80211_TXCTL_RATE_CTRL_PROBE = (1<<5),
|
||||
IEEE80211_TXCTL_CLEAR_PS_FILT = (1<<6),
|
||||
IEEE80211_TXCTL_REQUEUE = (1<<7),
|
||||
IEEE80211_TXCTL_FIRST_FRAGMENT = (1<<8),
|
||||
IEEE80211_TXCTL_SHORT_PREAMBLE = (1<<9),
|
||||
IEEE80211_TXCTL_LONG_RETRY_LIMIT = (1<<10),
|
||||
IEEE80211_TXCTL_EAPOL_FRAME = (1<<11),
|
||||
IEEE80211_TXCTL_SEND_AFTER_DTIM = (1<<12),
|
||||
IEEE80211_TXCTL_AMPDU = (1<<13),
|
||||
IEEE80211_TXCTL_OFDM_HT = (1<<14),
|
||||
IEEE80211_TXCTL_GREEN_FIELD = (1<<15),
|
||||
IEEE80211_TXCTL_40_MHZ_WIDTH = (1<<16),
|
||||
IEEE80211_TXCTL_DUP_DATA = (1<<17),
|
||||
IEEE80211_TXCTL_SHORT_GI = (1<<18),
|
||||
};
|
||||
|
||||
/* Transmit control fields. This data structure is passed to low-level driver
|
||||
@@ -318,57 +290,27 @@ struct ieee80211_bss_conf {
|
||||
|
||||
struct ieee80211_tx_control {
|
||||
struct ieee80211_vif *vif;
|
||||
int tx_rate; /* Transmit rate, given as the hw specific value for the
|
||||
* rate (from struct ieee80211_rate) */
|
||||
int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw
|
||||
* specific value for the rate (from
|
||||
* struct ieee80211_rate) */
|
||||
struct ieee80211_rate *tx_rate;
|
||||
|
||||
#define IEEE80211_TXCTL_REQ_TX_STATUS (1<<0)/* request TX status callback for
|
||||
* this frame */
|
||||
#define IEEE80211_TXCTL_DO_NOT_ENCRYPT (1<<1) /* send this frame without
|
||||
* encryption; e.g., for EAPOL
|
||||
* frames */
|
||||
#define IEEE80211_TXCTL_USE_RTS_CTS (1<<2) /* use RTS-CTS before sending
|
||||
* frame */
|
||||
#define IEEE80211_TXCTL_USE_CTS_PROTECT (1<<3) /* use CTS protection for the
|
||||
* frame (e.g., for combined
|
||||
* 802.11g / 802.11b networks) */
|
||||
#define IEEE80211_TXCTL_NO_ACK (1<<4) /* tell the low level not to
|
||||
* wait for an ack */
|
||||
#define IEEE80211_TXCTL_RATE_CTRL_PROBE (1<<5)
|
||||
#define IEEE80211_TXCTL_CLEAR_DST_MASK (1<<6)
|
||||
#define IEEE80211_TXCTL_REQUEUE (1<<7)
|
||||
#define IEEE80211_TXCTL_FIRST_FRAGMENT (1<<8) /* this is a first fragment of
|
||||
* the frame */
|
||||
#define IEEE80211_TXCTL_LONG_RETRY_LIMIT (1<<10) /* this frame should be send
|
||||
* using the through
|
||||
* set_retry_limit configured
|
||||
* long retry value */
|
||||
#define IEEE80211_TXCTL_EAPOL_FRAME (1<<11) /* internal to mac80211 */
|
||||
#define IEEE80211_TXCTL_SEND_AFTER_DTIM (1<<12) /* send this frame after DTIM
|
||||
* beacon */
|
||||
u32 flags; /* tx control flags defined
|
||||
* above */
|
||||
/* Transmit rate for RTS/CTS frame */
|
||||
struct ieee80211_rate *rts_cts_rate;
|
||||
|
||||
/* retry rate for the last retries */
|
||||
struct ieee80211_rate *alt_retry_rate;
|
||||
|
||||
u32 flags; /* tx control flags defined above */
|
||||
u8 key_idx; /* keyidx from hw->set_key(), undefined if
|
||||
* IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */
|
||||
u8 retry_limit; /* 1 = only first attempt, 2 = one retry, ..
|
||||
* This could be used when set_retry_limit
|
||||
* is not implemented by the driver */
|
||||
u8 power_level; /* per-packet transmit power level, in dBm */
|
||||
u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */
|
||||
u8 antenna_sel_tx; /* 0 = default/diversity, otherwise bit
|
||||
* position represents antenna number used */
|
||||
u8 icv_len; /* length of the ICV/MIC field in octets */
|
||||
u8 iv_len; /* length of the IV field in octets */
|
||||
u8 queue; /* hardware queue to use for this frame;
|
||||
* 0 = highest, hw->queues-1 = lowest */
|
||||
struct ieee80211_rate *rate; /* internal 80211.o rate */
|
||||
struct ieee80211_rate *rts_rate; /* internal 80211.o rate
|
||||
* for RTS/CTS */
|
||||
int alt_retry_rate; /* retry rate for the last retries, given as the
|
||||
* hw specific value for the rate (from
|
||||
* struct ieee80211_rate). To be used to limit
|
||||
* packet dropping when probing higher rates, if hw
|
||||
* supports multiple retry rates. -1 = not used */
|
||||
u16 aid; /* Station AID */
|
||||
int type; /* internal */
|
||||
};
|
||||
|
||||
@@ -391,7 +333,8 @@ struct ieee80211_tx_control {
|
||||
* @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on
|
||||
* the frame.
|
||||
* @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field)
|
||||
* is valid.
|
||||
* is valid. This is useful in monitor mode and necessary for beacon frames
|
||||
* to enable IBSS merging.
|
||||
*/
|
||||
enum mac80211_rx_flags {
|
||||
RX_FLAG_MMIC_ERROR = 1<<0,
|
||||
@@ -410,27 +353,26 @@ enum mac80211_rx_flags {
|
||||
* The low-level driver should provide this information (the subset
|
||||
* supported by hardware) to the 802.11 code with each received
|
||||
* frame.
|
||||
* @mactime: MAC timestamp as defined by 802.11
|
||||
* @mactime: value in microseconds of the 64-bit Time Synchronization Function
|
||||
* (TSF) timer when the first data symbol (MPDU) arrived at the hardware.
|
||||
* @band: the active band when this frame was received
|
||||
* @freq: frequency the radio was tuned to when receiving this frame, in MHz
|
||||
* @channel: channel the radio was tuned to
|
||||
* @phymode: active PHY mode
|
||||
* @ssi: signal strength when receiving this frame
|
||||
* @signal: used as 'qual' in statistics reporting
|
||||
* @noise: PHY noise when receiving this frame
|
||||
* @antenna: antenna used
|
||||
* @rate: data rate
|
||||
* @rate_idx: index of data rate into band's supported rates
|
||||
* @flag: %RX_FLAG_*
|
||||
*/
|
||||
struct ieee80211_rx_status {
|
||||
u64 mactime;
|
||||
enum ieee80211_band band;
|
||||
int freq;
|
||||
int channel;
|
||||
enum ieee80211_phymode phymode;
|
||||
int ssi;
|
||||
int signal;
|
||||
int noise;
|
||||
int antenna;
|
||||
int rate;
|
||||
int rate_idx;
|
||||
int flag;
|
||||
};
|
||||
|
||||
@@ -441,12 +383,14 @@ struct ieee80211_rx_status {
|
||||
*
|
||||
* @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted
|
||||
* because the destination STA was in powersave mode.
|
||||
*
|
||||
* @IEEE80211_TX_STATUS_ACK: Frame was acknowledged
|
||||
* @IEEE80211_TX_STATUS_AMPDU: The frame was aggregated, so status
|
||||
* is for the whole aggregation.
|
||||
*/
|
||||
enum ieee80211_tx_status_flags {
|
||||
IEEE80211_TX_STATUS_TX_FILTERED = 1<<0,
|
||||
IEEE80211_TX_STATUS_ACK = 1<<1,
|
||||
IEEE80211_TX_STATUS_AMPDU = 1<<2,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -457,24 +401,25 @@ enum ieee80211_tx_status_flags {
|
||||
*
|
||||
* @control: a copy of the &struct ieee80211_tx_control passed to the driver
|
||||
* in the tx() callback.
|
||||
*
|
||||
* @flags: transmit status flags, defined above
|
||||
*
|
||||
* @ack_signal: signal strength of the ACK frame
|
||||
*
|
||||
* @retry_count: number of retries
|
||||
* @excessive_retries: set to 1 if the frame was retried many times
|
||||
* but not acknowledged
|
||||
*
|
||||
* @retry_count: number of retries
|
||||
*
|
||||
* @ampdu_ack_len: number of aggregated frames.
|
||||
* relevant only if IEEE80211_TX_STATUS_AMPDU was set.
|
||||
* @ampdu_ack_map: block ack bit map for the aggregation.
|
||||
* relevant only if IEEE80211_TX_STATUS_AMPDU was set.
|
||||
* @ack_signal: signal strength of the ACK frame
|
||||
* @queue_length: ?? REMOVE
|
||||
* @queue_number: ?? REMOVE
|
||||
*/
|
||||
struct ieee80211_tx_status {
|
||||
struct ieee80211_tx_control control;
|
||||
u8 flags;
|
||||
bool excessive_retries;
|
||||
u8 retry_count;
|
||||
bool excessive_retries;
|
||||
u8 ampdu_ack_len;
|
||||
u64 ampdu_ack_map;
|
||||
int ack_signal;
|
||||
int queue_length;
|
||||
int queue_number;
|
||||
@@ -502,41 +447,29 @@ enum ieee80211_conf_flags {
|
||||
*
|
||||
* @radio_enabled: when zero, driver is required to switch off the radio.
|
||||
* TODO make a flag
|
||||
* @channel: IEEE 802.11 channel number
|
||||
* @freq: frequency in MHz
|
||||
* @channel_val: hardware specific channel value for the channel
|
||||
* @phymode: PHY mode to activate (REMOVE)
|
||||
* @chan: channel to switch to, pointer to the channel information
|
||||
* @mode: pointer to mode definition
|
||||
* @regulatory_domain: ??
|
||||
* @beacon_int: beacon interval (TODO make interface config)
|
||||
* @flags: configuration flags defined above
|
||||
* @power_level: transmit power limit for current regulatory domain in dBm
|
||||
* @antenna_max: maximum antenna gain
|
||||
* @power_level: requested transmit power (in dBm)
|
||||
* @max_antenna_gain: maximum antenna gain (in dBi)
|
||||
* @antenna_sel_tx: transmit antenna selection, 0: default/diversity,
|
||||
* 1/2: antenna 0/1
|
||||
* @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx
|
||||
* @ht_conf: describes current self configuration of 802.11n HT capabilies
|
||||
* @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters
|
||||
* @channel: the channel to tune to
|
||||
*/
|
||||
struct ieee80211_conf {
|
||||
int channel; /* IEEE 802.11 channel number */
|
||||
int freq; /* MHz */
|
||||
int channel_val; /* hw specific value for the channel */
|
||||
|
||||
enum ieee80211_phymode phymode;
|
||||
struct ieee80211_channel *chan;
|
||||
struct ieee80211_hw_mode *mode;
|
||||
unsigned int regulatory_domain;
|
||||
int radio_enabled;
|
||||
|
||||
int beacon_int;
|
||||
u32 flags;
|
||||
u8 power_level;
|
||||
u8 antenna_max;
|
||||
int power_level;
|
||||
int max_antenna_gain;
|
||||
u8 antenna_sel_tx;
|
||||
u8 antenna_sel_rx;
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
|
||||
struct ieee80211_ht_info ht_conf;
|
||||
struct ieee80211_ht_bss_info ht_bss_conf;
|
||||
};
|
||||
@@ -555,12 +488,14 @@ struct ieee80211_conf {
|
||||
* @IEEE80211_IF_TYPE_WDS: interface in WDS mode.
|
||||
* @IEEE80211_IF_TYPE_VLAN: VLAN interface bound to an AP, drivers
|
||||
* will never see this type.
|
||||
* @IEEE80211_IF_TYPE_MESH_POINT: 802.11s mesh point
|
||||
*/
|
||||
enum ieee80211_if_types {
|
||||
IEEE80211_IF_TYPE_INVALID,
|
||||
IEEE80211_IF_TYPE_AP,
|
||||
IEEE80211_IF_TYPE_STA,
|
||||
IEEE80211_IF_TYPE_IBSS,
|
||||
IEEE80211_IF_TYPE_MESH_POINT,
|
||||
IEEE80211_IF_TYPE_MNTR,
|
||||
IEEE80211_IF_TYPE_WDS,
|
||||
IEEE80211_IF_TYPE_VLAN,
|
||||
@@ -582,6 +517,14 @@ struct ieee80211_vif {
|
||||
u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
|
||||
};
|
||||
|
||||
static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
|
||||
{
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
return vif->type == IEEE80211_IF_TYPE_MESH_POINT;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct ieee80211_if_init_conf - initial configuration of an interface
|
||||
*
|
||||
@@ -724,6 +667,21 @@ enum sta_notify_cmd {
|
||||
STA_NOTIFY_ADD, STA_NOTIFY_REMOVE
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_tkip_key_type - get tkip key
|
||||
*
|
||||
* Used by drivers which need to get a tkip key for skb. Some drivers need a
|
||||
* phase 1 key, others need a phase 2 key. A single function allows the driver
|
||||
* to get the key, this enum indicates what type of key is required.
|
||||
*
|
||||
* @IEEE80211_TKIP_P1_KEY: the driver needs a phase 1 key
|
||||
* @IEEE80211_TKIP_P2_KEY: the driver needs a phase 2 key
|
||||
*/
|
||||
enum ieee80211_tkip_key_type {
|
||||
IEEE80211_TKIP_P1_KEY,
|
||||
IEEE80211_TKIP_P2_KEY,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_hw_flags - hardware flags
|
||||
*
|
||||
@@ -757,15 +715,19 @@ enum sta_notify_cmd {
|
||||
* %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because
|
||||
* otherwise the stack will not know when the DTIM beacon was sent.
|
||||
*
|
||||
* @IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED:
|
||||
* Channels are already configured to the default regulatory domain
|
||||
* specified in the device's EEPROM
|
||||
* @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE:
|
||||
* Hardware is not capable of short slot operation on the 2.4 GHz band.
|
||||
*
|
||||
* @IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE:
|
||||
* Hardware is not capable of receiving frames with short preamble on
|
||||
* the 2.4 GHz band.
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0,
|
||||
IEEE80211_HW_RX_INCLUDES_FCS = 1<<1,
|
||||
IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2,
|
||||
IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED = 1<<3,
|
||||
IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE = 1<<3,
|
||||
IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -777,7 +739,8 @@ enum ieee80211_hw_flags {
|
||||
* @wiphy: This points to the &struct wiphy allocated for this
|
||||
* 802.11 PHY. You must fill in the @perm_addr and @dev
|
||||
* members of this structure using SET_IEEE80211_DEV()
|
||||
* and SET_IEEE80211_PERM_ADDR().
|
||||
* and SET_IEEE80211_PERM_ADDR(). Additionally, all supported
|
||||
* bands (with channels, bitrates) are registered here.
|
||||
*
|
||||
* @conf: &struct ieee80211_conf, device configuration, don't use.
|
||||
*
|
||||
@@ -888,6 +851,16 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr)
|
||||
* parameter is guaranteed to be valid until another call to set_key()
|
||||
* removes it, but it can only be used as a cookie to differentiate
|
||||
* keys.
|
||||
*
|
||||
* In TKIP some HW need to be provided a phase 1 key, for RX decryption
|
||||
* acceleration (i.e. iwlwifi). Those drivers should provide update_tkip_key
|
||||
* handler.
|
||||
* The update_tkip_key() call updates the driver with the new phase 1 key.
|
||||
* This happens everytime the iv16 wraps around (every 65536 packets). The
|
||||
* set_key() call will happen only once for each key (unless the AP did
|
||||
* rekeying), it will not include a valid phase 1 key. The valid phase 1 key is
|
||||
* provided by udpate_tkip_key only. The trigger that makes mac80211 call this
|
||||
* handler is software decryption with wrap around of iv16.
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -913,8 +886,18 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr)
|
||||
* parameter to see whether multicast frames should be accepted
|
||||
* or dropped.
|
||||
*
|
||||
* All unsupported flags in @total_flags must be cleared, i.e. you
|
||||
* should clear all bits except those you honoured.
|
||||
* All unsupported flags in @total_flags must be cleared.
|
||||
* Hardware does not support a flag if it is incapable of _passing_
|
||||
* the frame to the stack. Otherwise the driver must ignore
|
||||
* the flag, but not clear it.
|
||||
* You must _only_ clear the flag (announce no support for the
|
||||
* flag to mac80211) if you are not able to pass the packet type
|
||||
* to the stack (so the hardware always filters it).
|
||||
* So for example, you should clear @FIF_CONTROL, if your hardware
|
||||
* always filters control frames. If your hardware always passes
|
||||
* control frames to the kernel and is incapable of filtering them,
|
||||
* you do _not_ clear the @FIF_CONTROL flag.
|
||||
* This rule applies to all other FIF flags as well.
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -967,10 +950,14 @@ enum ieee80211_filter_flags {
|
||||
* &struct ieee80211_ops to indicate which action is needed.
|
||||
* @IEEE80211_AMPDU_RX_START: start Rx aggregation
|
||||
* @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
|
||||
* @IEEE80211_AMPDU_TX_START: start Tx aggregation
|
||||
* @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation
|
||||
*/
|
||||
enum ieee80211_ampdu_mlme_action {
|
||||
IEEE80211_AMPDU_RX_START,
|
||||
IEEE80211_AMPDU_RX_STOP,
|
||||
IEEE80211_AMPDU_TX_START,
|
||||
IEEE80211_AMPDU_TX_STOP,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1033,8 +1020,7 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* level driver (e.g. assoc/disassoc status, erp parameters).
|
||||
* This function should not be used if no BSS has been set, unless
|
||||
* for association indication. The @changed parameter indicates which
|
||||
* of the bss parameters has changed when a call is made. This callback
|
||||
* has to be atomic.
|
||||
* of the bss parameters has changed when a call is made.
|
||||
*
|
||||
* @configure_filter: Configure the device's RX filter.
|
||||
* See the section "Frame filtering" for more information.
|
||||
@@ -1050,8 +1036,14 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* and remove_interface calls, i.e. while the interface with the
|
||||
* given local_address is enabled.
|
||||
*
|
||||
* @update_tkip_key: See the section "Hardware crypto acceleration"
|
||||
* This callback will be called in the context of Rx. Called for drivers
|
||||
* which set IEEE80211_KEY_FLAG_TKIP_REQ_RX_P1_KEY.
|
||||
*
|
||||
* @hw_scan: Ask the hardware to service the scan request, no need to start
|
||||
* the scan state machine in stack.
|
||||
* the scan state machine in stack. The scan must honour the channel
|
||||
* configuration done by the regulatory agent in the wiphy's registered
|
||||
* bands.
|
||||
*
|
||||
* @get_stats: return low-level statistics
|
||||
*
|
||||
@@ -1111,7 +1103,8 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* The RA/TID combination determines the destination and TID we want
|
||||
* the ampdu action to be performed for. The action is defined through
|
||||
* ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
|
||||
* is the first frame we expect to perform the action on.
|
||||
* is the first frame we expect to perform the action on. notice
|
||||
* that TX/RX_STOP can pass NULL for this parameter.
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
@@ -1138,6 +1131,9 @@ struct ieee80211_ops {
|
||||
int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
const u8 *local_address, const u8 *address,
|
||||
struct ieee80211_key_conf *key);
|
||||
void (*update_tkip_key)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_key_conf *conf, const u8 *address,
|
||||
u32 iv32, u16 *phase1key);
|
||||
int (*hw_scan)(struct ieee80211_hw *hw, u8 *ssid, size_t len);
|
||||
int (*get_stats)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_low_level_stats *stats);
|
||||
@@ -1159,10 +1155,9 @@ struct ieee80211_ops {
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_tx_control *control);
|
||||
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
||||
int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
|
||||
int (*ampdu_action)(struct ieee80211_hw *hw,
|
||||
enum ieee80211_ampdu_mlme_action action,
|
||||
const u8 *ra, u16 tid, u16 ssn);
|
||||
const u8 *addr, u16 tid, u16 *ssn);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1183,8 +1178,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
|
||||
/**
|
||||
* ieee80211_register_hw - Register hardware device
|
||||
*
|
||||
* You must call this function before any other functions
|
||||
* except ieee80211_register_hwmode.
|
||||
* You must call this function before any other functions in
|
||||
* mac80211. Note that before a hardware can be registered, you
|
||||
* need to fill the contained wiphy's information.
|
||||
*
|
||||
* @hw: the device to register as returned by ieee80211_alloc_hw()
|
||||
*/
|
||||
@@ -1272,10 +1268,6 @@ static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Register a new hardware PHYMODE capability to the stack. */
|
||||
int ieee80211_register_hwmode(struct ieee80211_hw *hw,
|
||||
struct ieee80211_hw_mode *mode);
|
||||
|
||||
/**
|
||||
* ieee80211_unregister_hw - Unregister a hardware device
|
||||
*
|
||||
@@ -1308,7 +1300,10 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
* buffer in @skb must start with an IEEE 802.11 header or a radiotap
|
||||
* header if %RX_FLAG_RADIOTAP is set in the @status flags.
|
||||
*
|
||||
* This function may not be called in IRQ context.
|
||||
* This function may not be called in IRQ context. Calls to this function
|
||||
* for a single hardware must be synchronized against each other. Calls
|
||||
* to this function and ieee80211_rx_irqsafe() may not be mixed for a
|
||||
* single hardware.
|
||||
*
|
||||
* @hw: the hardware this frame came in on
|
||||
* @skb: the buffer to receive, owned by mac80211 after this call
|
||||
@@ -1325,7 +1320,10 @@ static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
* ieee80211_rx_irqsafe - receive frame
|
||||
*
|
||||
* Like ieee80211_rx() but can be called in IRQ context
|
||||
* (internally defers to a workqueue.)
|
||||
* (internally defers to a tasklet.)
|
||||
*
|
||||
* Calls to this function and ieee80211_rx() may not be mixed for a
|
||||
* single hardware.
|
||||
*
|
||||
* @hw: the hardware this frame came in on
|
||||
* @skb: the buffer to receive, owned by mac80211 after this call
|
||||
@@ -1344,6 +1342,11 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw,
|
||||
* transmitted. It is permissible to not call this function for
|
||||
* multicast frames but this can affect statistics.
|
||||
*
|
||||
* This function may not be called in IRQ context. Calls to this function
|
||||
* for a single hardware must be synchronized against each other. Calls
|
||||
* to this function and ieee80211_tx_status_irqsafe() may not be mixed
|
||||
* for a single hardware.
|
||||
*
|
||||
* @hw: the hardware the frame was transmitted by
|
||||
* @skb: the frame that was transmitted, owned by mac80211 after this call
|
||||
* @status: status information for this frame; the status pointer need not
|
||||
@@ -1353,6 +1356,22 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw,
|
||||
void ieee80211_tx_status(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_tx_status *status);
|
||||
|
||||
/**
|
||||
* ieee80211_tx_status_irqsafe - irq-safe transmit status callback
|
||||
*
|
||||
* Like ieee80211_tx_status() but can be called in IRQ context
|
||||
* (internally defers to a tasklet.)
|
||||
*
|
||||
* Calls to this function and ieee80211_tx_status() may not be mixed for a
|
||||
* single hardware.
|
||||
*
|
||||
* @hw: the hardware the frame was transmitted by
|
||||
* @skb: the frame that was transmitted, owned by mac80211 after this call
|
||||
* @status: status information for this frame; the status pointer need not
|
||||
* be valid after this function returns and is not freed by mac80211,
|
||||
* it is recommended that it points to a stack area
|
||||
*/
|
||||
void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_tx_status *status);
|
||||
@@ -1449,7 +1468,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||
* @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
||||
* @frame_len: the length of the frame.
|
||||
* @rate: the rate (in 100kbps) at which the frame is going to be transmitted.
|
||||
* @rate: the rate at which the frame is going to be transmitted.
|
||||
*
|
||||
* Calculate the duration field of some generic frame, given its
|
||||
* length and transmission rate (in 100kbps).
|
||||
@@ -1457,7 +1476,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
||||
__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
size_t frame_len,
|
||||
int rate);
|
||||
struct ieee80211_rate *rate);
|
||||
|
||||
/**
|
||||
* ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames
|
||||
@@ -1506,6 +1525,21 @@ int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
|
||||
*/
|
||||
int ieee80211_get_hdrlen(u16 fc);
|
||||
|
||||
/**
|
||||
* ieee80211_get_tkip_key - get a TKIP rc4 for skb
|
||||
*
|
||||
* This function computes a TKIP rc4 key for an skb. It computes
|
||||
* a phase 1 key if needed (iv16 wraps around). This function is to
|
||||
* be used by drivers which can do HW encryption but need to compute
|
||||
* to phase 1/2 key in SW.
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @skb: the skb for which the key is needed
|
||||
* @rc4key: a buffer to which the key will be written
|
||||
*/
|
||||
void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
|
||||
struct sk_buff *skb,
|
||||
enum ieee80211_tkip_key_type type, u8 *key);
|
||||
/**
|
||||
* ieee80211_wake_queue - wake specific queue
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
@@ -1574,4 +1608,92 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* ieee80211_start_tx_ba_session - Start a tx Block Ack session.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient
|
||||
* @tid: the TID to BA on.
|
||||
* @return: success if addBA request was sent, failure otherwise
|
||||
*
|
||||
* Although mac80211/low level driver/user space application can estimate
|
||||
* the need to start aggregation on a certain RA/TID, the session level
|
||||
* will be managed by the mac80211.
|
||||
*/
|
||||
int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid);
|
||||
|
||||
/**
|
||||
* ieee80211_start_tx_ba_cb - low level driver ready to aggregate.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient.
|
||||
* @tid: the TID to BA on.
|
||||
*
|
||||
* This function must be called by low level driver once it has
|
||||
* finished with preparations for the BA session.
|
||||
*/
|
||||
void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid);
|
||||
|
||||
/**
|
||||
* ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient.
|
||||
* @tid: the TID to BA on.
|
||||
*
|
||||
* This function must be called by low level driver once it has
|
||||
* finished with preparations for the BA session.
|
||||
* This version of the function is irq safe.
|
||||
*/
|
||||
void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
||||
u16 tid);
|
||||
|
||||
/**
|
||||
* ieee80211_stop_tx_ba_session - Stop a Block Ack session.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient
|
||||
* @tid: the TID to stop BA.
|
||||
* @initiator: if indicates initiator DELBA frame will be sent.
|
||||
* @return: error if no sta with matching da found, success otherwise
|
||||
*
|
||||
* Although mac80211/low level driver/user space application can estimate
|
||||
* the need to stop aggregation on a certain RA/TID, the session level
|
||||
* will be managed by the mac80211.
|
||||
*/
|
||||
int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw,
|
||||
u8 *ra, u16 tid,
|
||||
enum ieee80211_back_parties initiator);
|
||||
|
||||
/**
|
||||
* ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient.
|
||||
* @tid: the desired TID to BA on.
|
||||
*
|
||||
* This function must be called by low level driver once it has
|
||||
* finished with preparations for the BA session tear down.
|
||||
*/
|
||||
void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid);
|
||||
|
||||
/**
|
||||
* ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @ra: receiver address of the BA session recipient.
|
||||
* @tid: the desired TID to BA on.
|
||||
*
|
||||
* This function must be called by low level driver once it has
|
||||
* finished with preparations for the BA session tear down.
|
||||
* This version of the function is irq safe.
|
||||
*/
|
||||
void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
||||
u16 tid);
|
||||
|
||||
/**
|
||||
* ieee80211_notify_mac - low level driver notification
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
* @notification_types: enum ieee80211_notification_types
|
||||
*
|
||||
* This function must be called by low level driver to inform mac80211 of
|
||||
* low level driver status change or force mac80211 to re-assoc for low
|
||||
* level driver internal error that require re-assoc.
|
||||
*/
|
||||
void ieee80211_notify_mac(struct ieee80211_hw *hw,
|
||||
enum ieee80211_notification_types notif_type);
|
||||
#endif /* MAC80211_H */
|
||||
|
||||
@@ -28,9 +28,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#define MIP6_OPT_PAD_1 0
|
||||
#define MIP6_OPT_PAD_N 1
|
||||
|
||||
/*
|
||||
* Mobility Header
|
||||
*/
|
||||
|
||||
+18
-13
@@ -11,6 +11,15 @@
|
||||
#define NDISC_NEIGHBOUR_ADVERTISEMENT 136
|
||||
#define NDISC_REDIRECT 137
|
||||
|
||||
/*
|
||||
* Router type: cross-layer information from link-layer to
|
||||
* IPv6 layer reported by certain link types (e.g., RFC4214).
|
||||
*/
|
||||
#define NDISC_NODETYPE_UNSPEC 0 /* unspecified (default) */
|
||||
#define NDISC_NODETYPE_HOST 1 /* host or unauthorized router */
|
||||
#define NDISC_NODETYPE_NODEFAULT 2 /* non-default router */
|
||||
#define NDISC_NODETYPE_DEFAULT 3 /* default router */
|
||||
|
||||
/*
|
||||
* ndisc options
|
||||
*/
|
||||
@@ -77,7 +86,7 @@ struct nd_opt_hdr {
|
||||
} __attribute__((__packed__));
|
||||
|
||||
|
||||
extern int ndisc_init(struct net_proto_family *ops);
|
||||
extern int ndisc_init(void);
|
||||
|
||||
extern void ndisc_cleanup(void);
|
||||
|
||||
@@ -85,20 +94,17 @@ extern int ndisc_rcv(struct sk_buff *skb);
|
||||
|
||||
extern void ndisc_send_ns(struct net_device *dev,
|
||||
struct neighbour *neigh,
|
||||
struct in6_addr *solicit,
|
||||
struct in6_addr *daddr,
|
||||
struct in6_addr *saddr);
|
||||
const struct in6_addr *solicit,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr);
|
||||
|
||||
extern void ndisc_send_rs(struct net_device *dev,
|
||||
struct in6_addr *saddr,
|
||||
struct in6_addr *daddr);
|
||||
|
||||
extern void ndisc_forwarding_on(void);
|
||||
extern void ndisc_forwarding_off(void);
|
||||
const struct in6_addr *saddr,
|
||||
const struct in6_addr *daddr);
|
||||
|
||||
extern void ndisc_send_redirect(struct sk_buff *skb,
|
||||
struct neighbour *neigh,
|
||||
struct in6_addr *target);
|
||||
const struct in6_addr *target);
|
||||
|
||||
extern int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir);
|
||||
|
||||
@@ -107,7 +113,7 @@ extern int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *d
|
||||
/*
|
||||
* IGMP
|
||||
*/
|
||||
extern int igmp6_init(struct net_proto_family *ops);
|
||||
extern int igmp6_init(void);
|
||||
|
||||
extern void igmp6_cleanup(void);
|
||||
|
||||
@@ -115,7 +121,6 @@ extern int igmp6_event_query(struct sk_buff *skb);
|
||||
|
||||
extern int igmp6_event_report(struct sk_buff *skb);
|
||||
|
||||
extern void igmp6_cleanup(void);
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
|
||||
@@ -129,7 +134,7 @@ extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
|
||||
extern void inet6_ifinfo_notify(int event,
|
||||
struct inet6_dev *idev);
|
||||
|
||||
static inline struct neighbour * ndisc_get_neigh(struct net_device *dev, struct in6_addr *addr)
|
||||
static inline struct neighbour * ndisc_get_neigh(struct net_device *dev, const struct in6_addr *addr)
|
||||
{
|
||||
|
||||
if (dev)
|
||||
|
||||
+25
-6
@@ -38,7 +38,9 @@ struct neighbour;
|
||||
|
||||
struct neigh_parms
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
struct net_device *dev;
|
||||
struct neigh_parms *next;
|
||||
int (*neigh_setup)(struct neighbour *);
|
||||
@@ -131,7 +133,9 @@ struct neigh_ops
|
||||
struct pneigh_entry
|
||||
{
|
||||
struct pneigh_entry *next;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
struct net_device *dev;
|
||||
u8 flags;
|
||||
u8 key[0];
|
||||
@@ -213,6 +217,17 @@ extern struct neighbour *neigh_event_ns(struct neigh_table *tbl,
|
||||
|
||||
extern struct neigh_parms *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl);
|
||||
extern void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
|
||||
|
||||
static inline
|
||||
struct net *neigh_parms_net(const struct neigh_parms *parms)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return parms->net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern unsigned long neigh_rand_reach_time(unsigned long base);
|
||||
|
||||
extern void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
|
||||
@@ -224,6 +239,16 @@ extern struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
|
||||
struct net_device *dev);
|
||||
extern int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *key, struct net_device *dev);
|
||||
|
||||
static inline
|
||||
struct net *pneigh_net(const struct pneigh_entry *pneigh)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return pneigh->net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern void neigh_app_ns(struct neighbour *n);
|
||||
extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
|
||||
extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
|
||||
@@ -288,12 +313,6 @@ static inline void neigh_confirm(struct neighbour *neigh)
|
||||
neigh->confirmed = jiffies;
|
||||
}
|
||||
|
||||
static inline int neigh_is_connected(struct neighbour *neigh)
|
||||
{
|
||||
return neigh->nud_state&NUD_CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
|
||||
{
|
||||
neigh->used = jiffies;
|
||||
|
||||
+57
-26
@@ -8,24 +8,29 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
#include <net/netns/core.h>
|
||||
#include <net/netns/unix.h>
|
||||
#include <net/netns/packet.h>
|
||||
#include <net/netns/ipv4.h>
|
||||
#include <net/netns/ipv6.h>
|
||||
#include <net/netns/dccp.h>
|
||||
#include <net/netns/x_tables.h>
|
||||
|
||||
struct proc_dir_entry;
|
||||
struct net_device;
|
||||
struct sock;
|
||||
struct ctl_table_header;
|
||||
struct net_generic;
|
||||
|
||||
struct net {
|
||||
atomic_t count; /* To decided when the network
|
||||
* namespace should be freed.
|
||||
*/
|
||||
#ifdef NETNS_REFCNT_DEBUG
|
||||
atomic_t use_count; /* To track references we
|
||||
* destroy on demand
|
||||
*/
|
||||
#endif
|
||||
struct list_head list; /* list of network namespaces */
|
||||
struct work_struct work; /* work struct for freeing */
|
||||
|
||||
@@ -46,40 +51,46 @@ struct net {
|
||||
|
||||
struct sock *rtnl; /* rtnetlink socket */
|
||||
|
||||
/* core sysctls */
|
||||
struct ctl_table_header *sysctl_core_hdr;
|
||||
int sysctl_somaxconn;
|
||||
|
||||
struct netns_core core;
|
||||
struct netns_packet packet;
|
||||
struct netns_unix unx;
|
||||
struct netns_ipv4 ipv4;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
struct netns_ipv6 ipv6;
|
||||
#endif
|
||||
#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
|
||||
struct netns_dccp dccp;
|
||||
#endif
|
||||
#ifdef CONFIG_NETFILTER
|
||||
struct netns_xt xt;
|
||||
#endif
|
||||
struct net_generic *gen;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
|
||||
#include <linux/seq_file_net.h>
|
||||
|
||||
/* Init's network namespace */
|
||||
extern struct net init_net;
|
||||
#define INIT_NET_NS(net_ns) .net_ns = &init_net,
|
||||
#else
|
||||
#define INIT_NET_NS(net_ns)
|
||||
#endif
|
||||
|
||||
extern struct list_head net_namespace_list;
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
#define INIT_NET_NS(net_ns) .net_ns = &init_net,
|
||||
|
||||
extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns);
|
||||
#else
|
||||
|
||||
#else /* CONFIG_NET */
|
||||
|
||||
#define INIT_NET_NS(net_ns)
|
||||
|
||||
static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns)
|
||||
{
|
||||
/* There is nothing to copy so this is a noop */
|
||||
return net_ns;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_NET */
|
||||
|
||||
|
||||
extern struct list_head net_namespace_list;
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
extern void __put_net(struct net *net);
|
||||
@@ -108,15 +119,10 @@ static inline void put_net(struct net *net)
|
||||
__put_net(net);
|
||||
}
|
||||
|
||||
static inline struct net *hold_net(struct net *net)
|
||||
static inline
|
||||
int net_eq(const struct net *net1, const struct net *net2)
|
||||
{
|
||||
atomic_inc(&net->use_count);
|
||||
return net;
|
||||
}
|
||||
|
||||
static inline void release_net(struct net *net)
|
||||
{
|
||||
atomic_dec(&net->use_count);
|
||||
return net1 == net2;
|
||||
}
|
||||
#else
|
||||
static inline struct net *get_net(struct net *net)
|
||||
@@ -128,6 +134,33 @@ static inline void put_net(struct net *net)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct net *maybe_get_net(struct net *net)
|
||||
{
|
||||
return net;
|
||||
}
|
||||
|
||||
static inline
|
||||
int net_eq(const struct net *net1, const struct net *net2)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef NETNS_REFCNT_DEBUG
|
||||
static inline struct net *hold_net(struct net *net)
|
||||
{
|
||||
if (net)
|
||||
atomic_inc(&net->use_count);
|
||||
return net;
|
||||
}
|
||||
|
||||
static inline void release_net(struct net *net)
|
||||
{
|
||||
if (net)
|
||||
atomic_dec(&net->use_count);
|
||||
}
|
||||
#else
|
||||
static inline struct net *hold_net(struct net *net)
|
||||
{
|
||||
return net;
|
||||
@@ -136,13 +169,9 @@ static inline struct net *hold_net(struct net *net)
|
||||
static inline void release_net(struct net *net)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct net *maybe_get_net(struct net *net)
|
||||
{
|
||||
return net;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define for_each_net(VAR) \
|
||||
list_for_each_entry(VAR, &net_namespace_list, list)
|
||||
|
||||
@@ -166,6 +195,8 @@ extern int register_pernet_subsys(struct pernet_operations *);
|
||||
extern void unregister_pernet_subsys(struct pernet_operations *);
|
||||
extern int register_pernet_device(struct pernet_operations *);
|
||||
extern void unregister_pernet_device(struct pernet_operations *);
|
||||
extern int register_pernet_gen_device(int *id, struct pernet_operations *);
|
||||
extern void unregister_pernet_gen_device(int id, struct pernet_operations *);
|
||||
|
||||
struct ctl_path;
|
||||
struct ctl_table;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <asm/atomic.h>
|
||||
|
||||
#include <linux/netfilter/nf_conntrack_tcp.h>
|
||||
#include <linux/netfilter/nf_conntrack_dccp.h>
|
||||
#include <linux/netfilter/nf_conntrack_sctp.h>
|
||||
#include <linux/netfilter/nf_conntrack_proto_gre.h>
|
||||
#include <net/netfilter/ipv4/nf_conntrack_icmp.h>
|
||||
@@ -30,6 +31,7 @@
|
||||
/* per conntrack: protocol private data */
|
||||
union nf_conntrack_proto {
|
||||
/* insert conntrack proto private data here */
|
||||
struct nf_ct_dccp dccp;
|
||||
struct ip_ct_sctp sctp;
|
||||
struct ip_ct_tcp tcp;
|
||||
struct ip_ct_icmp icmp;
|
||||
@@ -46,6 +48,7 @@ union nf_conntrack_expect_proto {
|
||||
#include <linux/netfilter/nf_conntrack_pptp.h>
|
||||
#include <linux/netfilter/nf_conntrack_h323.h>
|
||||
#include <linux/netfilter/nf_conntrack_sane.h>
|
||||
#include <linux/netfilter/nf_conntrack_sip.h>
|
||||
|
||||
/* per conntrack: application helper private data */
|
||||
union nf_conntrack_help {
|
||||
@@ -54,6 +57,7 @@ union nf_conntrack_help {
|
||||
struct nf_ct_pptp_master ct_pptp_info;
|
||||
struct nf_ct_h323_master ct_h323_info;
|
||||
struct nf_ct_sane_master ct_sane_info;
|
||||
struct nf_ct_sip_master ct_sip_info;
|
||||
};
|
||||
|
||||
#include <linux/types.h>
|
||||
@@ -61,20 +65,16 @@ union nf_conntrack_help {
|
||||
#include <linux/timer.h>
|
||||
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
#define NF_CT_ASSERT(x) \
|
||||
do { \
|
||||
if (!(x)) \
|
||||
/* Wooah! I'm tripping my conntrack in a frenzy of \
|
||||
netplay... */ \
|
||||
printk("NF_CT_ASSERT: %s:%i(%s)\n", \
|
||||
__FILE__, __LINE__, __FUNCTION__); \
|
||||
} while(0)
|
||||
#define NF_CT_ASSERT(x) WARN_ON(!(x))
|
||||
#else
|
||||
#define NF_CT_ASSERT(x)
|
||||
#endif
|
||||
|
||||
struct nf_conntrack_helper;
|
||||
|
||||
/* Must be kept in sync with the classes defined by helpers */
|
||||
#define NF_CT_MAX_EXPECT_CLASSES 3
|
||||
|
||||
/* nf_conn feature for connections that have a helper */
|
||||
struct nf_conn_help {
|
||||
/* Helper. if any */
|
||||
@@ -85,7 +85,7 @@ struct nf_conn_help {
|
||||
struct hlist_head expectations;
|
||||
|
||||
/* Current number of expected connections */
|
||||
unsigned int expecting;
|
||||
u8 expecting[NF_CT_MAX_EXPECT_CLASSES];
|
||||
};
|
||||
|
||||
|
||||
@@ -140,6 +140,16 @@ nf_ct_tuplehash_to_ctrack(const struct nf_conntrack_tuple_hash *hash)
|
||||
tuplehash[hash->tuple.dst.dir]);
|
||||
}
|
||||
|
||||
static inline u_int16_t nf_ct_l3num(const struct nf_conn *ct)
|
||||
{
|
||||
return ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
|
||||
}
|
||||
|
||||
static inline u_int8_t nf_ct_protonum(const struct nf_conn *ct)
|
||||
{
|
||||
return ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum;
|
||||
}
|
||||
|
||||
/* get master conntrack via master expectation */
|
||||
#define master_ct(conntr) (conntr->master)
|
||||
|
||||
@@ -184,12 +194,11 @@ extern void nf_conntrack_hash_insert(struct nf_conn *ct);
|
||||
|
||||
extern void nf_conntrack_flush(void);
|
||||
|
||||
extern int nf_ct_get_tuplepr(const struct sk_buff *skb,
|
||||
unsigned int nhoff,
|
||||
u_int16_t l3num,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
extern int nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
extern bool nf_ct_get_tuplepr(const struct sk_buff *skb,
|
||||
unsigned int nhoff, u_int16_t l3num,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
extern bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
|
||||
extern void __nf_ct_refresh_acct(struct nf_conn *ct,
|
||||
enum ip_conntrack_info ctinfo,
|
||||
|
||||
@@ -30,7 +30,7 @@ extern void nf_conntrack_cleanup(void);
|
||||
extern int nf_conntrack_proto_init(void);
|
||||
extern void nf_conntrack_proto_fini(void);
|
||||
|
||||
extern int
|
||||
extern bool
|
||||
nf_ct_get_tuple(const struct sk_buff *skb,
|
||||
unsigned int nhoff,
|
||||
unsigned int dataoff,
|
||||
@@ -40,7 +40,7 @@ nf_ct_get_tuple(const struct sk_buff *skb,
|
||||
const struct nf_conntrack_l3proto *l3proto,
|
||||
const struct nf_conntrack_l4proto *l4proto);
|
||||
|
||||
extern int
|
||||
extern bool
|
||||
nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig,
|
||||
const struct nf_conntrack_l3proto *l3proto,
|
||||
|
||||
@@ -41,6 +41,9 @@ struct nf_conntrack_expect
|
||||
/* Flags */
|
||||
unsigned int flags;
|
||||
|
||||
/* Expectation class */
|
||||
unsigned int class;
|
||||
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
__be32 saved_ip;
|
||||
/* This is the original per-proto part, used to map the
|
||||
@@ -53,7 +56,16 @@ struct nf_conntrack_expect
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
#define NF_CT_EXPECT_PERMANENT 0x1
|
||||
struct nf_conntrack_expect_policy
|
||||
{
|
||||
unsigned int max_expected;
|
||||
unsigned int timeout;
|
||||
};
|
||||
|
||||
#define NF_CT_EXPECT_CLASS_DEFAULT 0
|
||||
|
||||
#define NF_CT_EXPECT_PERMANENT 0x1
|
||||
#define NF_CT_EXPECT_INACTIVE 0x2
|
||||
|
||||
int nf_conntrack_expect_init(void);
|
||||
void nf_conntrack_expect_fini(void);
|
||||
@@ -74,10 +86,10 @@ void nf_ct_unexpect_related(struct nf_conntrack_expect *exp);
|
||||
/* Allocate space for an expectation: this is mandatory before calling
|
||||
nf_ct_expect_related. You will have to call put afterwards. */
|
||||
struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me);
|
||||
void nf_ct_expect_init(struct nf_conntrack_expect *, int,
|
||||
union nf_inet_addr *,
|
||||
union nf_inet_addr *,
|
||||
u_int8_t, __be16 *, __be16 *);
|
||||
void nf_ct_expect_init(struct nf_conntrack_expect *, unsigned int, int,
|
||||
const union nf_inet_addr *,
|
||||
const union nf_inet_addr *,
|
||||
u_int8_t, const __be16 *, const __be16 *);
|
||||
void nf_ct_expect_put(struct nf_conntrack_expect *exp);
|
||||
int nf_ct_expect_related(struct nf_conntrack_expect *expect);
|
||||
|
||||
|
||||
@@ -20,9 +20,7 @@ struct nf_conntrack_helper
|
||||
|
||||
const char *name; /* name of the module */
|
||||
struct module *me; /* pointer to self */
|
||||
unsigned int max_expected; /* Maximum number of concurrent
|
||||
* expected connections */
|
||||
unsigned int timeout; /* timeout for expecteds */
|
||||
const struct nf_conntrack_expect_policy *expect_policy;
|
||||
|
||||
/* Tuple of things we will help (compared against server response) */
|
||||
struct nf_conntrack_tuple tuple;
|
||||
@@ -37,6 +35,7 @@ struct nf_conntrack_helper
|
||||
void (*destroy)(struct nf_conn *ct);
|
||||
|
||||
int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct);
|
||||
unsigned int expect_class_max;
|
||||
};
|
||||
|
||||
extern struct nf_conntrack_helper *
|
||||
|
||||
@@ -28,31 +28,20 @@ struct nf_conntrack_l3proto
|
||||
* Try to fill in the third arg: nhoff is offset of l3 proto
|
||||
* hdr. Return true if possible.
|
||||
*/
|
||||
int (*pkt_to_tuple)(const struct sk_buff *skb, unsigned int nhoff,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
bool (*pkt_to_tuple)(const struct sk_buff *skb, unsigned int nhoff,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
|
||||
/*
|
||||
* Invert the per-proto part of the tuple: ie. turn xmit into reply.
|
||||
* Some packets can't be inverted: return 0 in that case.
|
||||
*/
|
||||
int (*invert_tuple)(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
bool (*invert_tuple)(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
|
||||
/* Print out the per-protocol part of the tuple. */
|
||||
int (*print_tuple)(struct seq_file *s,
|
||||
const struct nf_conntrack_tuple *);
|
||||
|
||||
/* Returns verdict for packet, or -1 for invalid. */
|
||||
int (*packet)(struct nf_conn *ct,
|
||||
const struct sk_buff *skb,
|
||||
enum ip_conntrack_info ctinfo);
|
||||
|
||||
/*
|
||||
* Called when a new connection for this protocol found;
|
||||
* returns TRUE if it's OK. If so, packet() called next.
|
||||
*/
|
||||
int (*new)(struct nf_conn *ct, const struct sk_buff *skb);
|
||||
|
||||
/*
|
||||
* Called before tracking.
|
||||
* *dataoff: offset of protocol header (TCP, UDP,...) in skb
|
||||
|
||||
@@ -25,15 +25,14 @@ struct nf_conntrack_l4proto
|
||||
|
||||
/* Try to fill in the third arg: dataoff is offset past network protocol
|
||||
hdr. Return true if possible. */
|
||||
int (*pkt_to_tuple)(const struct sk_buff *skb,
|
||||
unsigned int dataoff,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
bool (*pkt_to_tuple)(const struct sk_buff *skb, unsigned int dataoff,
|
||||
struct nf_conntrack_tuple *tuple);
|
||||
|
||||
/* Invert the per-proto part of the tuple: ie. turn xmit into reply.
|
||||
* Some packets can't be inverted: return 0 in that case.
|
||||
*/
|
||||
int (*invert_tuple)(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
bool (*invert_tuple)(struct nf_conntrack_tuple *inverse,
|
||||
const struct nf_conntrack_tuple *orig);
|
||||
|
||||
/* Returns verdict for packet, or -1 for invalid. */
|
||||
int (*packet)(struct nf_conn *ct,
|
||||
@@ -45,8 +44,8 @@ struct nf_conntrack_l4proto
|
||||
|
||||
/* Called when a new connection for this protocol found;
|
||||
* returns TRUE if it's OK. If so, packet() called next. */
|
||||
int (*new)(struct nf_conn *ct, const struct sk_buff *skb,
|
||||
unsigned int dataoff);
|
||||
bool (*new)(struct nf_conn *ct, const struct sk_buff *skb,
|
||||
unsigned int dataoff);
|
||||
|
||||
/* Called when a conntrack entry is destroyed */
|
||||
void (*destroy)(struct nf_conn *ct);
|
||||
|
||||
@@ -39,6 +39,9 @@ union nf_conntrack_man_proto
|
||||
struct {
|
||||
__be16 id;
|
||||
} icmp;
|
||||
struct {
|
||||
__be16 port;
|
||||
} dccp;
|
||||
struct {
|
||||
__be16 port;
|
||||
} sctp;
|
||||
@@ -77,6 +80,9 @@ struct nf_conntrack_tuple
|
||||
struct {
|
||||
u_int8_t type, code;
|
||||
} icmp;
|
||||
struct {
|
||||
__be16 port;
|
||||
} dccp;
|
||||
struct {
|
||||
__be16 port;
|
||||
} sctp;
|
||||
@@ -113,11 +119,37 @@ struct nf_conntrack_tuple_mask
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NF_CT_DUMP_TUPLE(tp) \
|
||||
pr_debug("tuple %p: %u %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n", \
|
||||
(tp), (tp)->src.l3num, (tp)->dst.protonum, \
|
||||
NIP6(*(struct in6_addr *)(tp)->src.u3.all), ntohs((tp)->src.u.all), \
|
||||
NIP6(*(struct in6_addr *)(tp)->dst.u3.all), ntohs((tp)->dst.u.all))
|
||||
static inline void nf_ct_dump_tuple_ip(const struct nf_conntrack_tuple *t)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printk("tuple %p: %u " NIPQUAD_FMT ":%hu -> " NIPQUAD_FMT ":%hu\n",
|
||||
t, t->dst.protonum,
|
||||
NIPQUAD(t->src.u3.ip), ntohs(t->src.u.all),
|
||||
NIPQUAD(t->dst.u3.ip), ntohs(t->dst.u.all));
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void nf_ct_dump_tuple_ipv6(const struct nf_conntrack_tuple *t)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printk("tuple %p: %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n",
|
||||
t, t->dst.protonum,
|
||||
NIP6(*(struct in6_addr *)t->src.u3.all), ntohs(t->src.u.all),
|
||||
NIP6(*(struct in6_addr *)t->dst.u3.all), ntohs(t->dst.u.all));
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void nf_ct_dump_tuple(const struct nf_conntrack_tuple *t)
|
||||
{
|
||||
switch (t->src.l3num) {
|
||||
case AF_INET:
|
||||
nf_ct_dump_tuple_ip(t);
|
||||
break;
|
||||
case AF_INET6:
|
||||
nf_ct_dump_tuple_ipv6(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we're the first tuple, it's the original dir. */
|
||||
#define NF_CT_DIRECTION(h) \
|
||||
@@ -132,70 +164,64 @@ struct nf_conntrack_tuple_hash
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
static inline bool __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
{
|
||||
return (t1->src.u3.all[0] == t2->src.u3.all[0] &&
|
||||
t1->src.u3.all[1] == t2->src.u3.all[1] &&
|
||||
t1->src.u3.all[2] == t2->src.u3.all[2] &&
|
||||
t1->src.u3.all[3] == t2->src.u3.all[3] &&
|
||||
return (nf_inet_addr_cmp(&t1->src.u3, &t2->src.u3) &&
|
||||
t1->src.u.all == t2->src.u.all &&
|
||||
t1->src.l3num == t2->src.l3num);
|
||||
}
|
||||
|
||||
static inline int __nf_ct_tuple_dst_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
static inline bool __nf_ct_tuple_dst_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
{
|
||||
return (t1->dst.u3.all[0] == t2->dst.u3.all[0] &&
|
||||
t1->dst.u3.all[1] == t2->dst.u3.all[1] &&
|
||||
t1->dst.u3.all[2] == t2->dst.u3.all[2] &&
|
||||
t1->dst.u3.all[3] == t2->dst.u3.all[3] &&
|
||||
return (nf_inet_addr_cmp(&t1->dst.u3, &t2->dst.u3) &&
|
||||
t1->dst.u.all == t2->dst.u.all &&
|
||||
t1->dst.protonum == t2->dst.protonum);
|
||||
}
|
||||
|
||||
static inline int nf_ct_tuple_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
static inline bool nf_ct_tuple_equal(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2)
|
||||
{
|
||||
return __nf_ct_tuple_src_equal(t1, t2) &&
|
||||
__nf_ct_tuple_dst_equal(t1, t2);
|
||||
}
|
||||
|
||||
static inline int nf_ct_tuple_mask_equal(const struct nf_conntrack_tuple_mask *m1,
|
||||
const struct nf_conntrack_tuple_mask *m2)
|
||||
static inline bool
|
||||
nf_ct_tuple_mask_equal(const struct nf_conntrack_tuple_mask *m1,
|
||||
const struct nf_conntrack_tuple_mask *m2)
|
||||
{
|
||||
return (m1->src.u3.all[0] == m2->src.u3.all[0] &&
|
||||
m1->src.u3.all[1] == m2->src.u3.all[1] &&
|
||||
m1->src.u3.all[2] == m2->src.u3.all[2] &&
|
||||
m1->src.u3.all[3] == m2->src.u3.all[3] &&
|
||||
return (nf_inet_addr_cmp(&m1->src.u3, &m2->src.u3) &&
|
||||
m1->src.u.all == m2->src.u.all);
|
||||
}
|
||||
|
||||
static inline int nf_ct_tuple_src_mask_cmp(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2,
|
||||
const struct nf_conntrack_tuple_mask *mask)
|
||||
static inline bool
|
||||
nf_ct_tuple_src_mask_cmp(const struct nf_conntrack_tuple *t1,
|
||||
const struct nf_conntrack_tuple *t2,
|
||||
const struct nf_conntrack_tuple_mask *mask)
|
||||
{
|
||||
int count;
|
||||
|
||||
for (count = 0; count < NF_CT_TUPLE_L3SIZE; count++) {
|
||||
if ((t1->src.u3.all[count] ^ t2->src.u3.all[count]) &
|
||||
mask->src.u3.all[count])
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((t1->src.u.all ^ t2->src.u.all) & mask->src.u.all)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
if (t1->src.l3num != t2->src.l3num ||
|
||||
t1->dst.protonum != t2->dst.protonum)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline int nf_ct_tuple_mask_cmp(const struct nf_conntrack_tuple *t,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_conntrack_tuple_mask *mask)
|
||||
static inline bool
|
||||
nf_ct_tuple_mask_cmp(const struct nf_conntrack_tuple *t,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_conntrack_tuple_mask *mask)
|
||||
{
|
||||
return nf_ct_tuple_src_mask_cmp(t, tuple, mask) &&
|
||||
__nf_ct_tuple_dst_equal(t, tuple);
|
||||
|
||||
@@ -24,6 +24,9 @@ extern int nf_nat_mangle_udp_packet(struct sk_buff *skb,
|
||||
extern int nf_nat_seq_adjust(struct sk_buff *skb,
|
||||
struct nf_conn *ct,
|
||||
enum ip_conntrack_info ctinfo);
|
||||
extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb,
|
||||
struct nf_conn *ct,
|
||||
enum ip_conntrack_info ctinfo);
|
||||
|
||||
/* Setup NAT on this expected conntrack so it follows master, but goes
|
||||
* to port ct->master->saved_proto. */
|
||||
|
||||
@@ -8,9 +8,6 @@ struct nf_nat_range;
|
||||
|
||||
struct nf_nat_protocol
|
||||
{
|
||||
/* Protocol name */
|
||||
const char *name;
|
||||
|
||||
/* Protocol number. */
|
||||
unsigned int protonum;
|
||||
|
||||
@@ -18,25 +15,25 @@ struct nf_nat_protocol
|
||||
|
||||
/* Translate a packet to the target according to manip type.
|
||||
Return true if succeeded. */
|
||||
int (*manip_pkt)(struct sk_buff *skb,
|
||||
unsigned int iphdroff,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
enum nf_nat_manip_type maniptype);
|
||||
bool (*manip_pkt)(struct sk_buff *skb,
|
||||
unsigned int iphdroff,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
enum nf_nat_manip_type maniptype);
|
||||
|
||||
/* Is the manipable part of the tuple between min and max incl? */
|
||||
int (*in_range)(const struct nf_conntrack_tuple *tuple,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const union nf_conntrack_man_proto *min,
|
||||
const union nf_conntrack_man_proto *max);
|
||||
bool (*in_range)(const struct nf_conntrack_tuple *tuple,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const union nf_conntrack_man_proto *min,
|
||||
const union nf_conntrack_man_proto *max);
|
||||
|
||||
/* Alter the per-proto part of the tuple (depending on
|
||||
maniptype), to give a unique tuple in the given range if
|
||||
possible; return false if not. Per-protocol part of tuple
|
||||
is initialized to the incoming packet. */
|
||||
int (*unique_tuple)(struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_nat_range *range,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const struct nf_conn *ct);
|
||||
bool (*unique_tuple)(struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_nat_range *range,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const struct nf_conn *ct);
|
||||
|
||||
int (*range_to_nlattr)(struct sk_buff *skb,
|
||||
const struct nf_nat_range *range);
|
||||
@@ -62,9 +59,20 @@ extern int init_protocols(void) __init;
|
||||
extern void cleanup_protocols(void);
|
||||
extern const struct nf_nat_protocol *find_nat_proto(u_int16_t protonum);
|
||||
|
||||
extern int nf_nat_port_range_to_nlattr(struct sk_buff *skb,
|
||||
const struct nf_nat_range *range);
|
||||
extern int nf_nat_port_nlattr_to_range(struct nlattr *tb[],
|
||||
struct nf_nat_range *range);
|
||||
extern bool nf_nat_proto_in_range(const struct nf_conntrack_tuple *tuple,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const union nf_conntrack_man_proto *min,
|
||||
const union nf_conntrack_man_proto *max);
|
||||
|
||||
extern bool nf_nat_proto_unique_tuple(struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_nat_range *range,
|
||||
enum nf_nat_manip_type maniptype,
|
||||
const struct nf_conn *ct,
|
||||
u_int16_t *rover);
|
||||
|
||||
extern int nf_nat_proto_range_to_nlattr(struct sk_buff *skb,
|
||||
const struct nf_nat_range *range);
|
||||
extern int nf_nat_proto_nlattr_to_range(struct nlattr *tb[],
|
||||
struct nf_nat_range *range);
|
||||
|
||||
#endif /*_NF_NAT_PROTO_H*/
|
||||
|
||||
@@ -14,7 +14,4 @@ extern int nf_nat_rule_find(struct sk_buff *skb,
|
||||
|
||||
extern unsigned int
|
||||
alloc_null_binding(struct nf_conn *ct, unsigned int hooknum);
|
||||
|
||||
extern unsigned int
|
||||
alloc_null_binding_confirmed(struct nf_conn *ct, unsigned int hooknum);
|
||||
#endif /* _NF_NAT_RULE_H */
|
||||
|
||||
+10
-4
@@ -162,7 +162,7 @@ struct netlbl_lsm_secattr_catmap {
|
||||
|
||||
/**
|
||||
* struct netlbl_lsm_secattr - NetLabel LSM security attributes
|
||||
* @flags: indicate which attributes are contained in this structure
|
||||
* @flags: indicate structure attributes, see NETLBL_SECATTR_*
|
||||
* @type: indicate the NLTYPE of the attributes
|
||||
* @domain: the NetLabel LSM domain
|
||||
* @cache: NetLabel LSM specific cache
|
||||
@@ -180,17 +180,22 @@ struct netlbl_lsm_secattr_catmap {
|
||||
* NetLabel itself when returning security attributes to the LSM.
|
||||
*
|
||||
*/
|
||||
struct netlbl_lsm_secattr {
|
||||
u32 flags;
|
||||
/* bitmap values for 'flags' */
|
||||
#define NETLBL_SECATTR_NONE 0x00000000
|
||||
#define NETLBL_SECATTR_DOMAIN 0x00000001
|
||||
#define NETLBL_SECATTR_DOMAIN_CPY (NETLBL_SECATTR_DOMAIN | \
|
||||
NETLBL_SECATTR_FREE_DOMAIN)
|
||||
#define NETLBL_SECATTR_CACHE 0x00000002
|
||||
#define NETLBL_SECATTR_MLS_LVL 0x00000004
|
||||
#define NETLBL_SECATTR_MLS_CAT 0x00000008
|
||||
#define NETLBL_SECATTR_SECID 0x00000010
|
||||
/* bitmap meta-values for 'flags' */
|
||||
#define NETLBL_SECATTR_FREE_DOMAIN 0x01000000
|
||||
#define NETLBL_SECATTR_CACHEABLE (NETLBL_SECATTR_MLS_LVL | \
|
||||
NETLBL_SECATTR_MLS_CAT | \
|
||||
NETLBL_SECATTR_SECID)
|
||||
struct netlbl_lsm_secattr {
|
||||
u32 flags;
|
||||
u32 type;
|
||||
char *domain;
|
||||
struct netlbl_lsm_cache *cache;
|
||||
@@ -303,7 +308,8 @@ static inline void netlbl_secattr_init(struct netlbl_lsm_secattr *secattr)
|
||||
*/
|
||||
static inline void netlbl_secattr_destroy(struct netlbl_lsm_secattr *secattr)
|
||||
{
|
||||
kfree(secattr->domain);
|
||||
if (secattr->flags & NETLBL_SECATTR_FREE_DOMAIN)
|
||||
kfree(secattr->domain);
|
||||
if (secattr->flags & NETLBL_SECATTR_CACHE)
|
||||
netlbl_secattr_cache_free(secattr->cache);
|
||||
if (secattr->flags & NETLBL_SECATTR_MLS_CAT)
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef __NETNS_CORE_H__
|
||||
#define __NETNS_CORE_H__
|
||||
|
||||
struct ctl_table_header;
|
||||
struct prot_inuse;
|
||||
|
||||
struct netns_core {
|
||||
/* core sysctls */
|
||||
struct ctl_table_header *sysctl_hdr;
|
||||
|
||||
int sysctl_somaxconn;
|
||||
|
||||
struct prot_inuse *inuse;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef __NETNS_DCCP_H__
|
||||
#define __NETNS_DCCP_H__
|
||||
|
||||
struct sock;
|
||||
|
||||
struct netns_dccp {
|
||||
struct sock *v4_ctl_sk;
|
||||
struct sock *v6_ctl_sk;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* generic net pointers
|
||||
*/
|
||||
|
||||
#ifndef __NET_GENERIC_H__
|
||||
#define __NET_GENERIC_H__
|
||||
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
/*
|
||||
* Generic net pointers are to be used by modules to put some private
|
||||
* stuff on the struct net without explicit struct net modification
|
||||
*
|
||||
* The rules are simple:
|
||||
* 1. register the ops with register_pernet_gen_device to get the id
|
||||
* of your private pointer;
|
||||
* 2. call net_assign_generic() to put the private data on the struct
|
||||
* net (most preferably this should be done in the ->init callback
|
||||
* of the ops registered);
|
||||
* 3. do not change this pointer while the net is alive;
|
||||
* 4. do not try to have any private reference on the net_generic object.
|
||||
*
|
||||
* After accomplishing all of the above, the private pointer can be
|
||||
* accessed with the net_generic() call.
|
||||
*/
|
||||
|
||||
struct net_generic {
|
||||
unsigned int len;
|
||||
struct rcu_head rcu;
|
||||
|
||||
void *ptr[0];
|
||||
};
|
||||
|
||||
static inline void *net_generic(struct net *net, int id)
|
||||
{
|
||||
struct net_generic *ng;
|
||||
void *ptr;
|
||||
|
||||
rcu_read_lock();
|
||||
ng = rcu_dereference(net->gen);
|
||||
BUG_ON(id == 0 || id > ng->len);
|
||||
ptr = ng->ptr[id - 1];
|
||||
rcu_read_unlock();
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
extern int net_assign_generic(struct net *net, int id, void *data);
|
||||
#endif
|
||||
@@ -17,6 +17,7 @@ struct netns_ipv4 {
|
||||
#ifdef CONFIG_SYSCTL
|
||||
struct ctl_table_header *forw_hdr;
|
||||
struct ctl_table_header *frags_hdr;
|
||||
struct ctl_table_header *ipv4_hdr;
|
||||
#endif
|
||||
struct ipv4_devconf *devconf_all;
|
||||
struct ipv4_devconf *devconf_dflt;
|
||||
@@ -26,6 +27,9 @@ struct netns_ipv4 {
|
||||
struct hlist_head *fib_table_hash;
|
||||
struct sock *fibnl;
|
||||
|
||||
struct sock **icmp_sk;
|
||||
struct sock *tcp_sock;
|
||||
|
||||
struct netns_frags frags;
|
||||
#ifdef CONFIG_NETFILTER
|
||||
struct xt_table *iptable_filter;
|
||||
@@ -33,5 +37,12 @@ struct netns_ipv4 {
|
||||
struct xt_table *iptable_raw;
|
||||
struct xt_table *arptable_filter;
|
||||
#endif
|
||||
|
||||
int sysctl_icmp_echo_ignore_all;
|
||||
int sysctl_icmp_echo_ignore_broadcasts;
|
||||
int sysctl_icmp_ignore_bogus_error_responses;
|
||||
int sysctl_icmp_ratelimit;
|
||||
int sysctl_icmp_ratemask;
|
||||
int sysctl_icmp_errors_use_inbound_ifaddr;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -36,5 +36,23 @@ struct netns_ipv6 {
|
||||
struct xt_table *ip6table_mangle;
|
||||
struct xt_table *ip6table_raw;
|
||||
#endif
|
||||
struct rt6_info *ip6_null_entry;
|
||||
struct rt6_statistics *rt6_stats;
|
||||
struct timer_list *ip6_fib_timer;
|
||||
struct hlist_head *fib_table_hash;
|
||||
struct fib6_table *fib6_main_tbl;
|
||||
struct dst_ops *ip6_dst_ops;
|
||||
unsigned int ip6_rt_gc_expire;
|
||||
unsigned long ip6_rt_last_gc;
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
struct rt6_info *ip6_prohibit_entry;
|
||||
struct rt6_info *ip6_blk_hole_entry;
|
||||
struct fib6_table *fib6_local_tbl;
|
||||
struct fib_rules_ops *fib6_rules_ops;
|
||||
#endif
|
||||
struct sock **icmp_sk;
|
||||
struct sock *ndisc_sk;
|
||||
struct sock *tcp_sk;
|
||||
struct sock *igmp_sk;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -353,7 +353,7 @@ tcf_match_indev(struct sk_buff *skb, char *indev)
|
||||
if (indev[0]) {
|
||||
if (!skb->iif)
|
||||
return 0;
|
||||
dev = __dev_get_by_index(&init_net, skb->iif);
|
||||
dev = __dev_get_by_index(dev_net(skb->dev), skb->iif);
|
||||
if (!dev || strcmp(indev, dev->name))
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@ struct net_protocol {
|
||||
int (*gso_send_check)(struct sk_buff *skb);
|
||||
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
|
||||
int features);
|
||||
int no_policy;
|
||||
unsigned int no_policy:1,
|
||||
netns_ok:1;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
||||
|
||||
+2
-2
@@ -53,7 +53,7 @@ int raw_seq_open(struct inode *ino, struct file *file,
|
||||
|
||||
#endif
|
||||
|
||||
void raw_hash_sk(struct sock *sk, struct raw_hashinfo *h);
|
||||
void raw_unhash_sk(struct sock *sk, struct raw_hashinfo *h);
|
||||
void raw_hash_sk(struct sock *sk);
|
||||
void raw_unhash_sk(struct sock *sk);
|
||||
|
||||
#endif /* _RAW_H */
|
||||
|
||||
@@ -31,8 +31,7 @@ struct request_sock_ops {
|
||||
int obj_size;
|
||||
struct kmem_cache *slab;
|
||||
int (*rtx_syn_ack)(struct sock *sk,
|
||||
struct request_sock *req,
|
||||
struct dst_entry *dst);
|
||||
struct request_sock *req);
|
||||
void (*send_ack)(struct sk_buff *skb,
|
||||
struct request_sock *req);
|
||||
void (*send_reset)(struct sock *sk,
|
||||
@@ -46,7 +45,7 @@ struct request_sock {
|
||||
struct request_sock *dl_next; /* Must be first member! */
|
||||
u16 mss;
|
||||
u8 retrans;
|
||||
u8 __pad;
|
||||
u8 cookie_ts; /* syncookie: encode tcpopts in timestamp */
|
||||
/* The following two fields can be easily recomputed I think -AK */
|
||||
u32 window_clamp; /* window clamp at creation time */
|
||||
u32 rcv_wnd; /* rcv_wnd offered first time */
|
||||
@@ -116,8 +115,8 @@ struct request_sock_queue {
|
||||
struct request_sock *rskq_accept_head;
|
||||
struct request_sock *rskq_accept_tail;
|
||||
rwlock_t syn_wait_lock;
|
||||
u8 rskq_defer_accept;
|
||||
/* 3 bytes hole, try to pack */
|
||||
u16 rskq_defer_accept;
|
||||
/* 2 bytes hole, try to pack */
|
||||
struct listen_sock *listen_opt;
|
||||
};
|
||||
|
||||
|
||||
+2
-3
@@ -34,7 +34,6 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/security.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#warning This file is not supposed to be used outside of kernel.
|
||||
@@ -161,7 +160,7 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst,
|
||||
.dport = dport } } };
|
||||
|
||||
int err;
|
||||
struct net *net = sk->sk_net;
|
||||
struct net *net = sock_net(sk);
|
||||
if (!dst || !src) {
|
||||
err = __ip_route_output_key(net, rp, &fl);
|
||||
if (err)
|
||||
@@ -189,7 +188,7 @@ static inline int ip_route_newports(struct rtable **rp, u8 protocol,
|
||||
ip_rt_put(*rp);
|
||||
*rp = NULL;
|
||||
security_sk_classify_flow(sk, &fl);
|
||||
return ip_route_output_flow(sk->sk_net, rp, &fl, sk, 0);
|
||||
return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ struct rtnl_link_ops {
|
||||
|
||||
extern int __rtnl_link_register(struct rtnl_link_ops *ops);
|
||||
extern void __rtnl_link_unregister(struct rtnl_link_ops *ops);
|
||||
extern void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops);
|
||||
|
||||
extern int rtnl_link_register(struct rtnl_link_ops *ops);
|
||||
extern void rtnl_link_unregister(struct rtnl_link_ops *ops);
|
||||
|
||||
@@ -206,12 +206,11 @@ typedef struct {
|
||||
int sctp_init_cmd_seq(sctp_cmd_seq_t *seq);
|
||||
|
||||
/* Add a command to an sctp_cmd_seq_t.
|
||||
* Return 0 if the command sequence is full.
|
||||
*
|
||||
* Use the SCTP_* constructors defined by SCTP_ARG_CONSTRUCTOR() above
|
||||
* to wrap data which goes in the obj argument.
|
||||
*/
|
||||
int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj);
|
||||
void sctp_add_cmd_sf(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj);
|
||||
|
||||
/* Return the next command structure in an sctp_cmd_seq.
|
||||
* Return NULL at the end of the sequence.
|
||||
|
||||
@@ -368,11 +368,6 @@ void sctp_sysctl_unregister(void);
|
||||
#else
|
||||
static inline void sctp_sysctl_register(void) { return; }
|
||||
static inline void sctp_sysctl_unregister(void) { return; }
|
||||
static inline int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen) {
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Size of Supported Address Parameter for 'x' address types. */
|
||||
|
||||
@@ -385,14 +385,6 @@ static inline int ADDIP_SERIAL_gte(__u16 s, __u16 t)
|
||||
return (((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT));
|
||||
}
|
||||
|
||||
|
||||
/* Run sctp_add_cmd() generating a BUG() if there is a failure. */
|
||||
static inline void sctp_add_cmd_sf(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj)
|
||||
{
|
||||
if (unlikely(!sctp_add_cmd(seq, verb, obj)))
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* Check VTAG of the packet matches the sender's own tag. */
|
||||
static inline int
|
||||
sctp_vtag_verify(const struct sctp_chunk *chunk,
|
||||
|
||||
@@ -637,8 +637,6 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *,
|
||||
struct sctp_sndrcvinfo *,
|
||||
struct msghdr *, int len);
|
||||
void sctp_datamsg_put(struct sctp_datamsg *);
|
||||
void sctp_datamsg_free(struct sctp_datamsg *);
|
||||
void sctp_datamsg_track(struct sctp_chunk *);
|
||||
void sctp_chunk_fail(struct sctp_chunk *, int error);
|
||||
int sctp_chunk_abandoned(struct sctp_chunk *);
|
||||
|
||||
@@ -1661,6 +1659,9 @@ struct sctp_association {
|
||||
/* Transport to which SHUTDOWN chunk was last sent. */
|
||||
struct sctp_transport *shutdown_last_sent_to;
|
||||
|
||||
/* How many times have we resent a SHUTDOWN */
|
||||
int shutdown_retries;
|
||||
|
||||
/* Transport to which INIT chunk was last sent. */
|
||||
struct sctp_transport *init_last_sent_to;
|
||||
|
||||
@@ -1695,6 +1696,11 @@ struct sctp_association {
|
||||
*/
|
||||
__u16 unack_data;
|
||||
|
||||
/* The total number of data chunks that we've had to retransmit
|
||||
* as the result of a T3 timer expiration
|
||||
*/
|
||||
__u32 rtx_data_chunks;
|
||||
|
||||
/* This is the association's receive buffer space. This value is used
|
||||
* to set a_rwnd field in an INIT or a SACK chunk.
|
||||
*/
|
||||
|
||||
+51
-67
@@ -47,7 +47,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pcounter.h>
|
||||
#include <linux/skbuff.h> /* struct sk_buff */
|
||||
#include <linux/mm.h>
|
||||
#include <linux/security.h>
|
||||
@@ -70,7 +69,11 @@
|
||||
#define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \
|
||||
printk(KERN_DEBUG msg); } while (0)
|
||||
#else
|
||||
#define SOCK_DEBUG(sk, msg...) do { } while (0)
|
||||
/* Validate arguments and do nothing */
|
||||
static void inline int __attribute__ ((format (printf, 2, 3)))
|
||||
SOCK_DEBUG(struct sock *sk, const char *msg, ...)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This is the per-socket lock. The spinlock provides a synchronization
|
||||
@@ -122,7 +125,9 @@ struct sock_common {
|
||||
atomic_t skc_refcnt;
|
||||
unsigned int skc_hash;
|
||||
struct proto *skc_prot;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *skc_net;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -151,6 +156,7 @@ struct sock_common {
|
||||
* @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets
|
||||
* @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
|
||||
* @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
|
||||
* @sk_gso_max_size: Maximum GSO segment size to build
|
||||
* @sk_lingertime: %SO_LINGER l_linger setting
|
||||
* @sk_backlog: always used with the per-socket spinlock held
|
||||
* @sk_callback_lock: used with the callbacks in the end of this struct
|
||||
@@ -237,6 +243,7 @@ struct sock {
|
||||
gfp_t sk_allocation;
|
||||
int sk_route_caps;
|
||||
int sk_gso_type;
|
||||
unsigned int sk_gso_max_size;
|
||||
int sk_rcvlowat;
|
||||
unsigned long sk_flags;
|
||||
unsigned long sk_lingertime;
|
||||
@@ -498,6 +505,7 @@ extern int sk_wait_data(struct sock *sk, long *timeo);
|
||||
struct request_sock_ops;
|
||||
struct timewait_sock_ops;
|
||||
struct inet_hashinfo;
|
||||
struct raw_hashinfo;
|
||||
|
||||
/* Networking protocol blocks we attach to sockets.
|
||||
* socket layer -> transport layer interface
|
||||
@@ -553,7 +561,7 @@ struct proto {
|
||||
|
||||
/* Keeping track of sockets in use */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct pcounter inuse;
|
||||
unsigned int inuse_idx;
|
||||
#endif
|
||||
|
||||
/* Memory pressure */
|
||||
@@ -580,7 +588,11 @@ struct proto {
|
||||
struct request_sock_ops *rsk_prot;
|
||||
struct timewait_sock_ops *twsk_prot;
|
||||
|
||||
struct inet_hashinfo *hashinfo;
|
||||
union {
|
||||
struct inet_hashinfo *hashinfo;
|
||||
struct hlist_head *udp_hash;
|
||||
struct raw_hashinfo *raw_hash;
|
||||
} h;
|
||||
|
||||
struct module *owner;
|
||||
|
||||
@@ -622,36 +634,12 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
# define DEFINE_PROTO_INUSE(NAME) DEFINE_PCOUNTER(NAME)
|
||||
# define REF_PROTO_INUSE(NAME) PCOUNTER_MEMBER_INITIALIZER(NAME, .inuse)
|
||||
/* Called with local bh disabled */
|
||||
static inline void sock_prot_inuse_add(struct proto *prot, int inc)
|
||||
{
|
||||
pcounter_add(&prot->inuse, inc);
|
||||
}
|
||||
static inline int sock_prot_inuse_init(struct proto *proto)
|
||||
{
|
||||
return pcounter_alloc(&proto->inuse);
|
||||
}
|
||||
static inline int sock_prot_inuse_get(struct proto *proto)
|
||||
{
|
||||
return pcounter_getval(&proto->inuse);
|
||||
}
|
||||
static inline void sock_prot_inuse_free(struct proto *proto)
|
||||
{
|
||||
pcounter_free(&proto->inuse);
|
||||
}
|
||||
extern void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc);
|
||||
extern int sock_prot_inuse_get(struct net *net, struct proto *proto);
|
||||
#else
|
||||
# define DEFINE_PROTO_INUSE(NAME)
|
||||
# define REF_PROTO_INUSE(NAME)
|
||||
static void inline sock_prot_inuse_add(struct proto *prot, int inc)
|
||||
{
|
||||
}
|
||||
static int inline sock_prot_inuse_init(struct proto *proto)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void inline sock_prot_inuse_free(struct proto *proto)
|
||||
static void inline sock_prot_inuse_add(struct net *net, struct proto *prot,
|
||||
int inc)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -850,6 +838,7 @@ extern struct sock *sk_alloc(struct net *net, int family,
|
||||
gfp_t priority,
|
||||
struct proto *prot);
|
||||
extern void sk_free(struct sock *sk);
|
||||
extern void sk_release_kernel(struct sock *sk);
|
||||
extern struct sock *sk_clone(const struct sock *sk,
|
||||
const gfp_t priority);
|
||||
|
||||
@@ -938,41 +927,6 @@ extern void sk_common_release(struct sock *sk);
|
||||
/* Initialise core socket variables */
|
||||
extern void sock_init_data(struct socket *sock, struct sock *sk);
|
||||
|
||||
/**
|
||||
* sk_filter - run a packet through a socket filter
|
||||
* @sk: sock associated with &sk_buff
|
||||
* @skb: buffer to filter
|
||||
* @needlock: set to 1 if the sock is not locked by caller.
|
||||
*
|
||||
* Run the filter code and then cut skb->data to correct size returned by
|
||||
* sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
|
||||
* than pkt_len we keep whole skb->data. This is the socket level
|
||||
* wrapper to sk_run_filter. It returns 0 if the packet should
|
||||
* be accepted or -EPERM if the packet should be tossed.
|
||||
*
|
||||
*/
|
||||
|
||||
static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
int err;
|
||||
struct sk_filter *filter;
|
||||
|
||||
err = security_sock_rcv_skb(sk, skb);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
rcu_read_lock_bh();
|
||||
filter = rcu_dereference(sk->sk_filter);
|
||||
if (filter) {
|
||||
unsigned int pkt_len = sk_run_filter(skb, filter->insns,
|
||||
filter->len);
|
||||
err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
|
||||
}
|
||||
rcu_read_unlock_bh();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* sk_filter_release: Release a socket filter
|
||||
* @sk: socket
|
||||
@@ -1333,6 +1287,36 @@ static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_e
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline
|
||||
struct net *sock_net(const struct sock *sk)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return sk->sk_net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
void sock_net_set(struct sock *sk, struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
sk->sk_net = net;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Kernel sockets, f.e. rtnl or icmp_socket, are a part of a namespace.
|
||||
* They should not hold a referrence to a namespace in order to allow
|
||||
* to stop it.
|
||||
* Sockets after sk_change_net should be released using sk_release_kernel
|
||||
*/
|
||||
static inline void sk_change_net(struct sock *sk, struct net *net)
|
||||
{
|
||||
put_net(sock_net(sk));
|
||||
sock_net_set(sk, hold_net(net));
|
||||
}
|
||||
|
||||
extern void sock_enable_timestamp(struct sock *sk);
|
||||
extern int sock_get_timestamp(struct sock *, struct timeval __user *);
|
||||
extern int sock_get_timestampns(struct sock *, struct timespec __user *);
|
||||
|
||||
+25
-10
@@ -29,6 +29,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/cryptohash.h>
|
||||
|
||||
#include <net/inet_connection_sock.h>
|
||||
#include <net/inet_timewait_sock.h>
|
||||
@@ -138,6 +139,7 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
|
||||
#define MAX_TCP_KEEPINTVL 32767
|
||||
#define MAX_TCP_KEEPCNT 127
|
||||
#define MAX_TCP_SYNCNT 127
|
||||
#define MAX_TCP_ACCEPT_DEFERRED 65535
|
||||
|
||||
#define TCP_SYNQ_INTERVAL (HZ/5) /* Period of SYNACK timer */
|
||||
|
||||
@@ -434,11 +436,20 @@ extern int tcp_disconnect(struct sock *sk, int flags);
|
||||
extern void tcp_unhash(struct sock *sk);
|
||||
|
||||
/* From syncookies.c */
|
||||
extern __u32 syncookie_secret[2][16-4+SHA_DIGEST_WORDS];
|
||||
extern struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
|
||||
struct ip_options *opt);
|
||||
extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb,
|
||||
__u16 *mss);
|
||||
|
||||
extern __u32 cookie_init_timestamp(struct request_sock *req);
|
||||
extern void cookie_check_timestamp(struct tcp_options_received *tcp_opt);
|
||||
|
||||
/* From net/ipv6/syncookies.c */
|
||||
extern struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb);
|
||||
extern __u32 cookie_v6_init_sequence(struct sock *sk, struct sk_buff *skb,
|
||||
__u16 *mss);
|
||||
|
||||
/* tcp_output.c */
|
||||
|
||||
extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
|
||||
@@ -776,11 +787,14 @@ extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh);
|
||||
extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst);
|
||||
|
||||
/* Slow start with delack produces 3 packets of burst, so that
|
||||
* it is safe "de facto".
|
||||
* it is safe "de facto". This will be the default - same as
|
||||
* the default reordering threshold - but if reordering increases,
|
||||
* we must be able to allow cwnd to burst at least this much in order
|
||||
* to not pull it back when holes are filled.
|
||||
*/
|
||||
static __inline__ __u32 tcp_max_burst(const struct tcp_sock *tp)
|
||||
{
|
||||
return 3;
|
||||
return tp->reordering;
|
||||
}
|
||||
|
||||
/* Returns end sequence number of the receiver's advertised window */
|
||||
@@ -950,6 +964,7 @@ static inline void tcp_openreq_init(struct request_sock *req,
|
||||
struct inet_request_sock *ireq = inet_rsk(req);
|
||||
|
||||
req->rcv_wnd = 0; /* So that tcp_send_synack() knows! */
|
||||
req->cookie_ts = 0;
|
||||
tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq;
|
||||
req->mss = rx_opt->mss_clamp;
|
||||
req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0;
|
||||
@@ -1237,7 +1252,7 @@ static inline void tcp_insert_write_queue_after(struct sk_buff *skb,
|
||||
struct sk_buff *buff,
|
||||
struct sock *sk)
|
||||
{
|
||||
__skb_append(skb, buff, &sk->sk_write_queue);
|
||||
__skb_queue_after(&sk->sk_write_queue, skb, buff);
|
||||
}
|
||||
|
||||
/* Insert skb between prev and next on the write queue of sk. */
|
||||
@@ -1315,25 +1330,25 @@ enum tcp_seq_states {
|
||||
};
|
||||
|
||||
struct tcp_seq_afinfo {
|
||||
struct module *owner;
|
||||
char *name;
|
||||
sa_family_t family;
|
||||
int (*seq_show) (struct seq_file *m, void *v);
|
||||
struct file_operations *seq_fops;
|
||||
struct file_operations seq_fops;
|
||||
struct seq_operations seq_ops;
|
||||
};
|
||||
|
||||
struct tcp_iter_state {
|
||||
struct seq_net_private p;
|
||||
sa_family_t family;
|
||||
enum tcp_seq_states state;
|
||||
struct sock *syn_wait_sk;
|
||||
int bucket, sbucket, num, uid;
|
||||
struct seq_operations seq_ops;
|
||||
};
|
||||
|
||||
extern int tcp_proc_register(struct tcp_seq_afinfo *afinfo);
|
||||
extern void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo);
|
||||
extern int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
|
||||
extern void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
|
||||
|
||||
extern struct request_sock_ops tcp_request_sock_ops;
|
||||
extern struct request_sock_ops tcp6_request_sock_ops;
|
||||
|
||||
extern int tcp_v4_destroy_sock(struct sock *sk);
|
||||
|
||||
@@ -1375,7 +1390,7 @@ struct tcp_request_sock_ops {
|
||||
#endif
|
||||
};
|
||||
|
||||
extern void tcp_v4_init(struct net_proto_family *ops);
|
||||
extern void tcp_v4_init(void);
|
||||
extern void tcp_init(void);
|
||||
|
||||
#endif /* _TCP_H */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user