diff options
Diffstat (limited to 'include')
116 files changed, 3252 insertions, 739 deletions
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index e2ea0b2159cd..2fc8e14cc24a 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -94,6 +94,7 @@ header-y += if_ppp.h | |||
| 94 | header-y += if_slip.h | 94 | header-y += if_slip.h |
| 95 | header-y += if_strip.h | 95 | header-y += if_strip.h |
| 96 | header-y += if_tun.h | 96 | header-y += if_tun.h |
| 97 | header-y += if_x25.h | ||
| 97 | header-y += in_route.h | 98 | header-y += in_route.h |
| 98 | header-y += ioctl.h | 99 | header-y += ioctl.h |
| 99 | header-y += ip6_tunnel.h | 100 | header-y += ip6_tunnel.h |
diff --git a/include/linux/caif/caif_socket.h b/include/linux/caif/caif_socket.h new file mode 100644 index 000000000000..2a61eb1beb85 --- /dev/null +++ b/include/linux/caif/caif_socket.h | |||
| @@ -0,0 +1,165 @@ | |||
| 1 | /* linux/caif_socket.h | ||
| 2 | * CAIF Definitions for CAIF socket and network layer | ||
| 3 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 4 | * Author: Sjur Brendeland/ sjur.brandeland@stericsson.com | ||
| 5 | * License terms: GNU General Public License (GPL) version 2 | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef _LINUX_CAIF_SOCKET_H | ||
| 9 | #define _LINUX_CAIF_SOCKET_H | ||
| 10 | |||
| 11 | #include <linux/types.h> | ||
| 12 | |||
| 13 | #ifdef __KERNEL__ | ||
| 14 | #include <linux/socket.h> | ||
| 15 | #else | ||
| 16 | #include <sys/socket.h> | ||
| 17 | #endif | ||
| 18 | |||
| 19 | /** | ||
| 20 | * enum caif_link_selector - Physical Link Selection. | ||
| 21 | * @CAIF_LINK_HIGH_BANDW: Physical interface for high-bandwidth | ||
| 22 | * traffic. | ||
| 23 | * @CAIF_LINK_LOW_LATENCY: Physical interface for low-latency | ||
| 24 | * traffic. | ||
| 25 | * | ||
| 26 | * CAIF Link Layers can register their link properties. | ||
| 27 | * This enum is used for choosing between CAIF Link Layers when | ||
| 28 | * setting up CAIF Channels when multiple CAIF Link Layers exists. | ||
| 29 | */ | ||
| 30 | enum caif_link_selector { | ||
| 31 | CAIF_LINK_HIGH_BANDW, | ||
| 32 | CAIF_LINK_LOW_LATENCY | ||
| 33 | }; | ||
| 34 | |||
| 35 | /** | ||
| 36 | * enum caif_channel_priority - CAIF channel priorities. | ||
| 37 | * | ||
| 38 | * @CAIF_PRIO_MIN: Min priority for a channel. | ||
| 39 | * @CAIF_PRIO_LOW: Low-priority channel. | ||
| 40 | * @CAIF_PRIO_NORMAL: Normal/default priority level. | ||
| 41 | * @CAIF_PRIO_HIGH: High priority level | ||
| 42 | * @CAIF_PRIO_MAX: Max priority for channel | ||
| 43 | * | ||
| 44 | * Priority can be set on CAIF Channels in order to | ||
| 45 | * prioritize between traffic on different CAIF Channels. | ||
| 46 | * These priority levels are recommended, but the priority value | ||
| 47 | * is not restricted to the values defined in this enum, any value | ||
| 48 | * between CAIF_PRIO_MIN and CAIF_PRIO_MAX could be used. | ||
| 49 | */ | ||
| 50 | enum caif_channel_priority { | ||
| 51 | CAIF_PRIO_MIN = 0x01, | ||
| 52 | CAIF_PRIO_LOW = 0x04, | ||
| 53 | CAIF_PRIO_NORMAL = 0x0f, | ||
| 54 | CAIF_PRIO_HIGH = 0x14, | ||
| 55 | CAIF_PRIO_MAX = 0x1F | ||
| 56 | }; | ||
| 57 | |||
| 58 | /** | ||
| 59 | * enum caif_protocol_type - CAIF Channel type. | ||
| 60 | * @CAIFPROTO_AT: Classic AT channel. | ||
| 61 | * @CAIFPROTO_DATAGRAM: Datagram channel. | ||
| 62 | * @CAIFPROTO_DATAGRAM_LOOP: Datagram loopback channel, used for testing. | ||
| 63 | * @CAIFPROTO_UTIL: Utility (Psock) channel. | ||
| 64 | * @CAIFPROTO_RFM: Remote File Manager | ||
| 65 | * | ||
| 66 | * This enum defines the CAIF Channel type to be used. This defines | ||
| 67 | * the service to connect to on the modem. | ||
| 68 | */ | ||
| 69 | enum caif_protocol_type { | ||
| 70 | CAIFPROTO_AT, | ||
| 71 | CAIFPROTO_DATAGRAM, | ||
| 72 | CAIFPROTO_DATAGRAM_LOOP, | ||
| 73 | CAIFPROTO_UTIL, | ||
| 74 | CAIFPROTO_RFM, | ||
| 75 | _CAIFPROTO_MAX | ||
| 76 | }; | ||
| 77 | #define CAIFPROTO_MAX _CAIFPROTO_MAX | ||
| 78 | |||
| 79 | /** | ||
| 80 | * enum caif_at_type - AT Service Endpoint | ||
| 81 | * @CAIF_ATTYPE_PLAIN: Connects to a plain vanilla AT channel. | ||
| 82 | */ | ||
| 83 | enum caif_at_type { | ||
| 84 | CAIF_ATTYPE_PLAIN = 2 | ||
| 85 | }; | ||
| 86 | |||
| 87 | /** | ||
| 88 | * struct sockaddr_caif - the sockaddr structure for CAIF sockets. | ||
| 89 | * @family: Address family number, must be AF_CAIF. | ||
| 90 | * @u: Union of address data 'switched' by family. | ||
| 91 | * : | ||
| 92 | * @u.at: Applies when family = CAIFPROTO_AT. | ||
| 93 | * | ||
| 94 | * @u.at.type: Type of AT link to set up (enum caif_at_type). | ||
| 95 | * | ||
| 96 | * @u.util: Applies when family = CAIFPROTO_UTIL | ||
| 97 | * | ||
| 98 | * @u.util.service: Utility service name. | ||
| 99 | * | ||
| 100 | * @u.dgm: Applies when family = CAIFPROTO_DATAGRAM | ||
| 101 | * | ||
| 102 | * @u.dgm.connection_id: Datagram connection id. | ||
| 103 | * | ||
| 104 | * @u.dgm.nsapi: NSAPI of the PDP-Context. | ||
| 105 | * | ||
| 106 | * @u.rfm: Applies when family = CAIFPROTO_RFM | ||
| 107 | * | ||
| 108 | * @u.rfm.connection_id: Connection ID for RFM. | ||
| 109 | * | ||
| 110 | * @u.rfm.volume: Volume to mount. | ||
| 111 | * | ||
| 112 | * Description: | ||
| 113 | * This structure holds the connect parameters used for setting up a | ||
| 114 | * CAIF Channel. It defines the service to connect to on the modem. | ||
| 115 | */ | ||
| 116 | struct sockaddr_caif { | ||
| 117 | sa_family_t family; | ||
| 118 | union { | ||
| 119 | struct { | ||
| 120 | __u8 type; /* type: enum caif_at_type */ | ||
| 121 | } at; /* CAIFPROTO_AT */ | ||
| 122 | struct { | ||
| 123 | char service[16]; | ||
| 124 | } util; /* CAIFPROTO_UTIL */ | ||
| 125 | union { | ||
| 126 | __u32 connection_id; | ||
| 127 | __u8 nsapi; | ||
| 128 | } dgm; /* CAIFPROTO_DATAGRAM(_LOOP)*/ | ||
| 129 | struct { | ||
| 130 | __u32 connection_id; | ||
| 131 | char volume[16]; | ||
| 132 | } rfm; /* CAIFPROTO_RFM */ | ||
| 133 | } u; | ||
| 134 | }; | ||
| 135 | |||
| 136 | /** | ||
| 137 | * enum caif_socket_opts - CAIF option values for getsockopt and setsockopt. | ||
| 138 | * | ||
| 139 | * @CAIFSO_LINK_SELECT: Selector used if multiple CAIF Link layers are | ||
| 140 | * available. Either a high bandwidth | ||
| 141 | * link can be selected (CAIF_LINK_HIGH_BANDW) or | ||
| 142 | * or a low latency link (CAIF_LINK_LOW_LATENCY). | ||
| 143 | * This option is of type __u32. | ||
| 144 | * Alternatively SO_BINDTODEVICE can be used. | ||
| 145 | * | ||
| 146 | * @CAIFSO_REQ_PARAM: Used to set the request parameters for a | ||
| 147 | * utility channel. (maximum 256 bytes). This | ||
| 148 | * option must be set before connecting. | ||
| 149 | * | ||
| 150 | * @CAIFSO_RSP_PARAM: Gets the response parameters for a utility | ||
| 151 | * channel. (maximum 256 bytes). This option | ||
| 152 | * is valid after a successful connect. | ||
| 153 | * | ||
| 154 | * | ||
| 155 | * This enum defines the CAIF Socket options to be used on a socket | ||
| 156 | * of type PF_CAIF. | ||
| 157 | * | ||
| 158 | */ | ||
| 159 | enum caif_socket_opts { | ||
| 160 | CAIFSO_LINK_SELECT = 127, | ||
| 161 | CAIFSO_REQ_PARAM = 128, | ||
| 162 | CAIFSO_RSP_PARAM = 129, | ||
| 163 | }; | ||
| 164 | |||
| 165 | #endif /* _LINUX_CAIF_SOCKET_H */ | ||
diff --git a/include/linux/caif/if_caif.h b/include/linux/caif/if_caif.h new file mode 100644 index 000000000000..5e7eed4edf51 --- /dev/null +++ b/include/linux/caif/if_caif.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/ sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef IF_CAIF_H_ | ||
| 8 | #define IF_CAIF_H_ | ||
| 9 | #include <linux/sockios.h> | ||
| 10 | #include <linux/types.h> | ||
| 11 | #include <linux/socket.h> | ||
| 12 | |||
| 13 | /** | ||
| 14 | * enum ifla_caif - CAIF NetlinkRT parameters. | ||
| 15 | * @IFLA_CAIF_IPV4_CONNID: Connection ID for IPv4 PDP Context. | ||
| 16 | * The type of attribute is NLA_U32. | ||
| 17 | * @IFLA_CAIF_IPV6_CONNID: Connection ID for IPv6 PDP Context. | ||
| 18 | * The type of attribute is NLA_U32. | ||
| 19 | * @IFLA_CAIF_LOOPBACK: If different from zero, device is doing loopback | ||
| 20 | * The type of attribute is NLA_U8. | ||
| 21 | * | ||
| 22 | * When using RT Netlink to create, destroy or configure a CAIF IP interface, | ||
| 23 | * enum ifla_caif is used to specify the configuration attributes. | ||
| 24 | */ | ||
| 25 | enum ifla_caif { | ||
| 26 | __IFLA_CAIF_UNSPEC, | ||
| 27 | IFLA_CAIF_IPV4_CONNID, | ||
| 28 | IFLA_CAIF_IPV6_CONNID, | ||
| 29 | IFLA_CAIF_LOOPBACK, | ||
| 30 | __IFLA_CAIF_MAX | ||
| 31 | }; | ||
| 32 | #define IFLA_CAIF_MAX (__IFLA_CAIF_MAX-1) | ||
| 33 | |||
| 34 | #endif /*IF_CAIF_H_*/ | ||
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 6e5a7f00223d..cc0bb4961669 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #ifndef CAN_DEV_H | 14 | #ifndef CAN_DEV_H |
| 15 | #define CAN_DEV_H | 15 | #define CAN_DEV_H |
| 16 | 16 | ||
| 17 | #include <linux/can.h> | ||
| 17 | #include <linux/can/netlink.h> | 18 | #include <linux/can/netlink.h> |
| 18 | #include <linux/can/error.h> | 19 | #include <linux/can/error.h> |
| 19 | 20 | ||
diff --git a/include/linux/can/platform/mcp251x.h b/include/linux/can/platform/mcp251x.h index 1448177d86d5..dba28268e651 100644 --- a/include/linux/can/platform/mcp251x.h +++ b/include/linux/can/platform/mcp251x.h | |||
| @@ -26,8 +26,8 @@ | |||
| 26 | struct mcp251x_platform_data { | 26 | struct mcp251x_platform_data { |
| 27 | unsigned long oscillator_frequency; | 27 | unsigned long oscillator_frequency; |
| 28 | int model; | 28 | int model; |
| 29 | #define CAN_MCP251X_MCP2510 0 | 29 | #define CAN_MCP251X_MCP2510 0x2510 |
| 30 | #define CAN_MCP251X_MCP2515 1 | 30 | #define CAN_MCP251X_MCP2515 0x2515 |
| 31 | int (*board_specific_setup)(struct spi_device *spi); | 31 | int (*board_specific_setup)(struct spi_device *spi); |
| 32 | int (*transceiver_enable)(int enable); | 32 | int (*transceiver_enable)(int enable); |
| 33 | int (*power_enable) (int enable); | 33 | int (*power_enable) (int enable); |
diff --git a/include/linux/can/platform/sja1000.h b/include/linux/can/platform/sja1000.h index 01ee2aeb048d..96f8fcc78d78 100644 --- a/include/linux/can/platform/sja1000.h +++ b/include/linux/can/platform/sja1000.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #define OCR_TX_SHIFT 2 | 26 | #define OCR_TX_SHIFT 2 |
| 27 | 27 | ||
| 28 | struct sja1000_platform_data { | 28 | struct sja1000_platform_data { |
| 29 | u32 clock; /* CAN bus oscillator frequency in Hz */ | 29 | u32 osc_freq; /* CAN bus oscillator frequency in Hz */ |
| 30 | 30 | ||
| 31 | u8 ocr; /* output control register */ | 31 | u8 ocr; /* output control register */ |
| 32 | u8 cdr; /* clock divider register */ | 32 | u8 cdr; /* clock divider register */ |
diff --git a/include/linux/dcbnl.h b/include/linux/dcbnl.h index b7cdbb4373df..8723491f7dfd 100644 --- a/include/linux/dcbnl.h +++ b/include/linux/dcbnl.h | |||
| @@ -22,8 +22,6 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
| 24 | 24 | ||
| 25 | #define DCB_PROTO_VERSION 1 | ||
| 26 | |||
| 27 | struct dcbmsg { | 25 | struct dcbmsg { |
| 28 | __u8 dcb_family; | 26 | __u8 dcb_family; |
| 29 | __u8 cmd; | 27 | __u8 cmd; |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index b33f316bb92e..276b40a16835 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
| @@ -310,6 +310,7 @@ struct ethtool_perm_addr { | |||
| 310 | enum ethtool_flags { | 310 | enum ethtool_flags { |
| 311 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ | 311 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ |
| 312 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ | 312 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ |
| 313 | ETH_FLAG_RXHASH = (1 << 28), | ||
| 313 | }; | 314 | }; |
| 314 | 315 | ||
| 315 | /* The following structures are for supporting RX network flow | 316 | /* The following structures are for supporting RX network flow |
| @@ -490,12 +491,12 @@ void ethtool_ntuple_flush(struct net_device *dev); | |||
| 490 | * get_ufo: Report whether UDP fragmentation offload is enabled | 491 | * get_ufo: Report whether UDP fragmentation offload is enabled |
| 491 | * set_ufo: Turn UDP fragmentation offload on or off | 492 | * set_ufo: Turn UDP fragmentation offload on or off |
| 492 | * self_test: Run specified self-tests | 493 | * self_test: Run specified self-tests |
| 493 | * get_strings: Return a set of strings that describe the requested objects | 494 | * get_strings: Return a set of strings that describe the requested objects |
| 494 | * phys_id: Identify the device | 495 | * phys_id: Identify the device |
| 495 | * get_stats: Return statistics about the device | 496 | * get_stats: Return statistics about the device |
| 496 | * get_flags: get 32-bit flags bitmap | 497 | * get_flags: get 32-bit flags bitmap |
| 497 | * set_flags: set 32-bit flags bitmap | 498 | * set_flags: set 32-bit flags bitmap |
| 498 | * | 499 | * |
| 499 | * Description: | 500 | * Description: |
| 500 | * | 501 | * |
| 501 | * get_settings: | 502 | * get_settings: |
| @@ -531,14 +532,20 @@ struct ethtool_ops { | |||
| 531 | int (*nway_reset)(struct net_device *); | 532 | int (*nway_reset)(struct net_device *); |
| 532 | u32 (*get_link)(struct net_device *); | 533 | u32 (*get_link)(struct net_device *); |
| 533 | int (*get_eeprom_len)(struct net_device *); | 534 | int (*get_eeprom_len)(struct net_device *); |
| 534 | int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); | 535 | int (*get_eeprom)(struct net_device *, |
| 535 | int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); | 536 | struct ethtool_eeprom *, u8 *); |
| 537 | int (*set_eeprom)(struct net_device *, | ||
| 538 | struct ethtool_eeprom *, u8 *); | ||
| 536 | int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); | 539 | int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); |
| 537 | int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); | 540 | int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); |
| 538 | void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); | 541 | void (*get_ringparam)(struct net_device *, |
| 539 | int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); | 542 | struct ethtool_ringparam *); |
| 540 | void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam*); | 543 | int (*set_ringparam)(struct net_device *, |
| 541 | int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam*); | 544 | struct ethtool_ringparam *); |
| 545 | void (*get_pauseparam)(struct net_device *, | ||
| 546 | struct ethtool_pauseparam*); | ||
| 547 | int (*set_pauseparam)(struct net_device *, | ||
| 548 | struct ethtool_pauseparam*); | ||
| 542 | u32 (*get_rx_csum)(struct net_device *); | 549 | u32 (*get_rx_csum)(struct net_device *); |
| 543 | int (*set_rx_csum)(struct net_device *, u32); | 550 | int (*set_rx_csum)(struct net_device *, u32); |
| 544 | u32 (*get_tx_csum)(struct net_device *); | 551 | u32 (*get_tx_csum)(struct net_device *); |
| @@ -550,21 +557,24 @@ struct ethtool_ops { | |||
| 550 | void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); | 557 | void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); |
| 551 | void (*get_strings)(struct net_device *, u32 stringset, u8 *); | 558 | void (*get_strings)(struct net_device *, u32 stringset, u8 *); |
| 552 | int (*phys_id)(struct net_device *, u32); | 559 | int (*phys_id)(struct net_device *, u32); |
| 553 | void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); | 560 | void (*get_ethtool_stats)(struct net_device *, |
| 561 | struct ethtool_stats *, u64 *); | ||
| 554 | int (*begin)(struct net_device *); | 562 | int (*begin)(struct net_device *); |
| 555 | void (*complete)(struct net_device *); | 563 | void (*complete)(struct net_device *); |
| 556 | u32 (*get_ufo)(struct net_device *); | 564 | u32 (*get_ufo)(struct net_device *); |
| 557 | int (*set_ufo)(struct net_device *, u32); | 565 | int (*set_ufo)(struct net_device *, u32); |
| 558 | u32 (*get_flags)(struct net_device *); | 566 | u32 (*get_flags)(struct net_device *); |
| 559 | int (*set_flags)(struct net_device *, u32); | 567 | int (*set_flags)(struct net_device *, u32); |
| 560 | u32 (*get_priv_flags)(struct net_device *); | 568 | u32 (*get_priv_flags)(struct net_device *); |
| 561 | int (*set_priv_flags)(struct net_device *, u32); | 569 | int (*set_priv_flags)(struct net_device *, u32); |
| 562 | int (*get_sset_count)(struct net_device *, int); | 570 | int (*get_sset_count)(struct net_device *, int); |
| 563 | int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, void *); | 571 | int (*get_rxnfc)(struct net_device *, |
| 572 | struct ethtool_rxnfc *, void *); | ||
| 564 | int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); | 573 | int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); |
| 565 | int (*flash_device)(struct net_device *, struct ethtool_flash *); | 574 | int (*flash_device)(struct net_device *, struct ethtool_flash *); |
| 566 | int (*reset)(struct net_device *, u32 *); | 575 | int (*reset)(struct net_device *, u32 *); |
| 567 | int (*set_rx_ntuple)(struct net_device *, struct ethtool_rx_ntuple *); | 576 | int (*set_rx_ntuple)(struct net_device *, |
| 577 | struct ethtool_rx_ntuple *); | ||
| 568 | int (*get_rx_ntuple)(struct net_device *, u32 stringset, void *); | 578 | int (*get_rx_ntuple)(struct net_device *, u32 stringset, void *); |
| 569 | }; | 579 | }; |
| 570 | #endif /* __KERNEL__ */ | 580 | #endif /* __KERNEL__ */ |
| @@ -576,29 +586,29 @@ struct ethtool_ops { | |||
| 576 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ | 586 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ |
| 577 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ | 587 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ |
| 578 | #define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options. */ | 588 | #define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options. */ |
| 579 | #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ | 589 | #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ |
| 580 | #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level. */ | 590 | #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level. */ |
| 581 | #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation. */ | 591 | #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation. */ |
| 582 | #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ | 592 | #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ |
| 583 | #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ | 593 | #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ |
| 584 | #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data. */ | 594 | #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data. */ |
| 585 | #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ | 595 | #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ |
| 586 | #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ | 596 | #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ |
| 587 | #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ | 597 | #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ |
| 588 | #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters. */ | 598 | #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters. */ |
| 589 | #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ | 599 | #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ |
| 590 | #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ | 600 | #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ |
| 591 | #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ | 601 | #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ |
| 592 | #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ | 602 | #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ |
| 593 | #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ | 603 | #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ |
| 594 | #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ | 604 | #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ |
| 595 | #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable | 605 | #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable |
| 596 | * (ethtool_value) */ | 606 | * (ethtool_value) */ |
| 597 | #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable | 607 | #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable |
| 598 | * (ethtool_value). */ | 608 | * (ethtool_value). */ |
| 599 | #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test. */ | 609 | #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test. */ |
| 600 | #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ | 610 | #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ |
| 601 | #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ | 611 | #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ |
| 602 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ | 612 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ |
| 603 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ | 613 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ |
| 604 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ | 614 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ |
| @@ -609,24 +619,24 @@ struct ethtool_ops { | |||
| 609 | #define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */ | 619 | #define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */ |
| 610 | #define ETHTOOL_GFLAGS 0x00000025 /* Get flags bitmap(ethtool_value) */ | 620 | #define ETHTOOL_GFLAGS 0x00000025 /* Get flags bitmap(ethtool_value) */ |
| 611 | #define ETHTOOL_SFLAGS 0x00000026 /* Set flags bitmap(ethtool_value) */ | 621 | #define ETHTOOL_SFLAGS 0x00000026 /* Set flags bitmap(ethtool_value) */ |
| 612 | #define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */ | 622 | #define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */ |
| 613 | #define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */ | 623 | #define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */ |
| 614 | 624 | ||
| 615 | #define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */ | 625 | #define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */ |
| 616 | #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ | 626 | #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ |
| 617 | #define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (ethtool_value) */ | 627 | #define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (ethtool_value) */ |
| 618 | #define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (ethtool_value) */ | 628 | #define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (ethtool_value) */ |
| 619 | #define ETHTOOL_GRXRINGS 0x0000002d /* Get RX rings available for LB */ | 629 | #define ETHTOOL_GRXRINGS 0x0000002d /* Get RX rings available for LB */ |
| 620 | #define ETHTOOL_GRXCLSRLCNT 0x0000002e /* Get RX class rule count */ | 630 | #define ETHTOOL_GRXCLSRLCNT 0x0000002e /* Get RX class rule count */ |
| 621 | #define ETHTOOL_GRXCLSRULE 0x0000002f /* Get RX classification rule */ | 631 | #define ETHTOOL_GRXCLSRULE 0x0000002f /* Get RX classification rule */ |
| 622 | #define ETHTOOL_GRXCLSRLALL 0x00000030 /* Get all RX classification rule */ | 632 | #define ETHTOOL_GRXCLSRLALL 0x00000030 /* Get all RX classification rule */ |
| 623 | #define ETHTOOL_SRXCLSRLDEL 0x00000031 /* Delete RX classification rule */ | 633 | #define ETHTOOL_SRXCLSRLDEL 0x00000031 /* Delete RX classification rule */ |
| 624 | #define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ | 634 | #define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ |
| 625 | #define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ | 635 | #define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ |
| 626 | #define ETHTOOL_RESET 0x00000034 /* Reset hardware */ | 636 | #define ETHTOOL_RESET 0x00000034 /* Reset hardware */ |
| 627 | #define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ | 637 | #define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ |
| 628 | #define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ | 638 | #define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ |
| 629 | #define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ | 639 | #define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ |
| 630 | 640 | ||
| 631 | /* compatibility with older code */ | 641 | /* compatibility with older code */ |
| 632 | #define SPARC_ETH_GSET ETHTOOL_GSET | 642 | #define SPARC_ETH_GSET ETHTOOL_GSET |
| @@ -635,18 +645,18 @@ struct ethtool_ops { | |||
| 635 | /* Indicates what features are supported by the interface. */ | 645 | /* Indicates what features are supported by the interface. */ |
| 636 | #define SUPPORTED_10baseT_Half (1 << 0) | 646 | #define SUPPORTED_10baseT_Half (1 << 0) |
| 637 | #define SUPPORTED_10baseT_Full (1 << 1) | 647 | #define SUPPORTED_10baseT_Full (1 << 1) |
| 638 | #define SUPPORTED_100baseT_Half (1 << 2) | 648 | #define SUPPORTED_100baseT_Half (1 << 2) |
| 639 | #define SUPPORTED_100baseT_Full (1 << 3) | 649 | #define SUPPORTED_100baseT_Full (1 << 3) |
| 640 | #define SUPPORTED_1000baseT_Half (1 << 4) | 650 | #define SUPPORTED_1000baseT_Half (1 << 4) |
| 641 | #define SUPPORTED_1000baseT_Full (1 << 5) | 651 | #define SUPPORTED_1000baseT_Full (1 << 5) |
| 642 | #define SUPPORTED_Autoneg (1 << 6) | 652 | #define SUPPORTED_Autoneg (1 << 6) |
| 643 | #define SUPPORTED_TP (1 << 7) | 653 | #define SUPPORTED_TP (1 << 7) |
| 644 | #define SUPPORTED_AUI (1 << 8) | 654 | #define SUPPORTED_AUI (1 << 8) |
| 645 | #define SUPPORTED_MII (1 << 9) | 655 | #define SUPPORTED_MII (1 << 9) |
| 646 | #define SUPPORTED_FIBRE (1 << 10) | 656 | #define SUPPORTED_FIBRE (1 << 10) |
| 647 | #define SUPPORTED_BNC (1 << 11) | 657 | #define SUPPORTED_BNC (1 << 11) |
| 648 | #define SUPPORTED_10000baseT_Full (1 << 12) | 658 | #define SUPPORTED_10000baseT_Full (1 << 12) |
| 649 | #define SUPPORTED_Pause (1 << 13) | 659 | #define SUPPORTED_Pause (1 << 13) |
| 650 | #define SUPPORTED_Asym_Pause (1 << 14) | 660 | #define SUPPORTED_Asym_Pause (1 << 14) |
| 651 | #define SUPPORTED_2500baseX_Full (1 << 15) | 661 | #define SUPPORTED_2500baseX_Full (1 << 15) |
| 652 | #define SUPPORTED_Backplane (1 << 16) | 662 | #define SUPPORTED_Backplane (1 << 16) |
| @@ -656,8 +666,8 @@ struct ethtool_ops { | |||
| 656 | #define SUPPORTED_10000baseR_FEC (1 << 20) | 666 | #define SUPPORTED_10000baseR_FEC (1 << 20) |
| 657 | 667 | ||
| 658 | /* Indicates what features are advertised by the interface. */ | 668 | /* Indicates what features are advertised by the interface. */ |
| 659 | #define ADVERTISED_10baseT_Half (1 << 0) | 669 | #define ADVERTISED_10baseT_Half (1 << 0) |
| 660 | #define ADVERTISED_10baseT_Full (1 << 1) | 670 | #define ADVERTISED_10baseT_Full (1 << 1) |
| 661 | #define ADVERTISED_100baseT_Half (1 << 2) | 671 | #define ADVERTISED_100baseT_Half (1 << 2) |
| 662 | #define ADVERTISED_100baseT_Full (1 << 3) | 672 | #define ADVERTISED_100baseT_Full (1 << 3) |
| 663 | #define ADVERTISED_1000baseT_Half (1 << 4) | 673 | #define ADVERTISED_1000baseT_Half (1 << 4) |
| @@ -696,12 +706,12 @@ struct ethtool_ops { | |||
| 696 | #define DUPLEX_FULL 0x01 | 706 | #define DUPLEX_FULL 0x01 |
| 697 | 707 | ||
| 698 | /* Which connector port. */ | 708 | /* Which connector port. */ |
| 699 | #define PORT_TP 0x00 | 709 | #define PORT_TP 0x00 |
| 700 | #define PORT_AUI 0x01 | 710 | #define PORT_AUI 0x01 |
| 701 | #define PORT_MII 0x02 | 711 | #define PORT_MII 0x02 |
| 702 | #define PORT_FIBRE 0x03 | 712 | #define PORT_FIBRE 0x03 |
| 703 | #define PORT_BNC 0x04 | 713 | #define PORT_BNC 0x04 |
| 704 | #define PORT_DA 0x05 | 714 | #define PORT_DA 0x05 |
| 705 | #define PORT_NONE 0xef | 715 | #define PORT_NONE 0xef |
| 706 | #define PORT_OTHER 0xff | 716 | #define PORT_OTHER 0xff |
| 707 | 717 | ||
| @@ -715,7 +725,7 @@ struct ethtool_ops { | |||
| 715 | /* Enable or disable autonegotiation. If this is set to enable, | 725 | /* Enable or disable autonegotiation. If this is set to enable, |
| 716 | * the forced link modes above are completely ignored. | 726 | * the forced link modes above are completely ignored. |
| 717 | */ | 727 | */ |
| 718 | #define AUTONEG_DISABLE 0x00 | 728 | #define AUTONEG_DISABLE 0x00 |
| 719 | #define AUTONEG_ENABLE 0x01 | 729 | #define AUTONEG_ENABLE 0x01 |
| 720 | 730 | ||
| 721 | /* Mode MDI or MDI-X */ | 731 | /* Mode MDI or MDI-X */ |
| @@ -746,8 +756,8 @@ struct ethtool_ops { | |||
| 746 | #define AH_V6_FLOW 0x0b | 756 | #define AH_V6_FLOW 0x0b |
| 747 | #define ESP_V6_FLOW 0x0c | 757 | #define ESP_V6_FLOW 0x0c |
| 748 | #define IP_USER_FLOW 0x0d | 758 | #define IP_USER_FLOW 0x0d |
| 749 | #define IPV4_FLOW 0x10 | 759 | #define IPV4_FLOW 0x10 |
| 750 | #define IPV6_FLOW 0x11 | 760 | #define IPV6_FLOW 0x11 |
| 751 | 761 | ||
| 752 | /* L3-L4 network traffic flow hash options */ | 762 | /* L3-L4 network traffic flow hash options */ |
| 753 | #define RXH_L2DA (1 << 1) | 763 | #define RXH_L2DA (1 << 1) |
diff --git a/include/linux/filter.h b/include/linux/filter.h index 29a0e3db9f43..151f5d703b7e 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
| @@ -123,7 +123,8 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ | |||
| 123 | #define SKF_AD_NLATTR_NEST 16 | 123 | #define SKF_AD_NLATTR_NEST 16 |
| 124 | #define SKF_AD_MARK 20 | 124 | #define SKF_AD_MARK 20 |
| 125 | #define SKF_AD_QUEUE 24 | 125 | #define SKF_AD_QUEUE 24 |
| 126 | #define SKF_AD_MAX 28 | 126 | #define SKF_AD_HATYPE 28 |
| 127 | #define SKF_AD_MAX 32 | ||
| 127 | #define SKF_NET_OFF (-0x100000) | 128 | #define SKF_NET_OFF (-0x100000) |
| 128 | #define SKF_LL_OFF (-0x200000) | 129 | #define SKF_LL_OFF (-0x200000) |
| 129 | 130 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 948bd2bfb1de..4079ef99900f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1280,10 +1280,12 @@ static inline int lock_may_write(struct inode *inode, loff_t start, | |||
| 1280 | 1280 | ||
| 1281 | 1281 | ||
| 1282 | struct fasync_struct { | 1282 | struct fasync_struct { |
| 1283 | int magic; | 1283 | spinlock_t fa_lock; |
| 1284 | int fa_fd; | 1284 | int magic; |
| 1285 | struct fasync_struct *fa_next; /* singly linked list */ | 1285 | int fa_fd; |
| 1286 | struct file *fa_file; | 1286 | struct fasync_struct *fa_next; /* singly linked list */ |
| 1287 | struct file *fa_file; | ||
| 1288 | struct rcu_head fa_rcu; | ||
| 1287 | }; | 1289 | }; |
| 1288 | 1290 | ||
| 1289 | #define FASYNC_MAGIC 0x4601 | 1291 | #define FASYNC_MAGIC 0x4601 |
| @@ -1292,8 +1294,6 @@ struct fasync_struct { | |||
| 1292 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); | 1294 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); |
| 1293 | /* can be called from interrupts */ | 1295 | /* can be called from interrupts */ |
| 1294 | extern void kill_fasync(struct fasync_struct **, int, int); | 1296 | extern void kill_fasync(struct fasync_struct **, int, int); |
| 1295 | /* only for net: no internal synchronization */ | ||
| 1296 | extern void __kill_fasync(struct fasync_struct *, int, int); | ||
| 1297 | 1297 | ||
| 1298 | extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force); | 1298 | extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force); |
| 1299 | extern int f_setown(struct file *filp, unsigned long arg, int force); | 1299 | extern int f_setown(struct file *filp, unsigned long arg, int force); |
diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h index b834ef6d59fa..61549b26ad6f 100644 --- a/include/linux/genetlink.h +++ b/include/linux/genetlink.h | |||
| @@ -80,4 +80,12 @@ enum { | |||
| 80 | 80 | ||
| 81 | #define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) | 81 | #define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) |
| 82 | 82 | ||
| 83 | #ifdef __KERNEL__ | ||
| 84 | |||
| 85 | /* All generic netlink requests are serialized by a global lock. */ | ||
| 86 | extern void genl_lock(void); | ||
| 87 | extern void genl_unlock(void); | ||
| 88 | |||
| 89 | #endif /* __KERNEL__ */ | ||
| 90 | |||
| 83 | #endif /* __LINUX_GENERIC_NETLINK_H */ | 91 | #endif /* __LINUX_GENERIC_NETLINK_H */ |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 19984958ab7b..97b2eae6a22c 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -876,6 +876,7 @@ struct ieee80211_ht_cap { | |||
| 876 | #define IEEE80211_HT_CAP_SGI_40 0x0040 | 876 | #define IEEE80211_HT_CAP_SGI_40 0x0040 |
| 877 | #define IEEE80211_HT_CAP_TX_STBC 0x0080 | 877 | #define IEEE80211_HT_CAP_TX_STBC 0x0080 |
| 878 | #define IEEE80211_HT_CAP_RX_STBC 0x0300 | 878 | #define IEEE80211_HT_CAP_RX_STBC 0x0300 |
| 879 | #define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 | ||
| 879 | #define IEEE80211_HT_CAP_DELAY_BA 0x0400 | 880 | #define IEEE80211_HT_CAP_DELAY_BA 0x0400 |
| 880 | #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 | 881 | #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 |
| 881 | #define IEEE80211_HT_CAP_DSSSCCK40 0x1000 | 882 | #define IEEE80211_HT_CAP_DSSSCCK40 0x1000 |
| @@ -1211,6 +1212,8 @@ enum ieee80211_category { | |||
| 1211 | WLAN_CATEGORY_SA_QUERY = 8, | 1212 | WLAN_CATEGORY_SA_QUERY = 8, |
| 1212 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, | 1213 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, |
| 1213 | WLAN_CATEGORY_WMM = 17, | 1214 | WLAN_CATEGORY_WMM = 17, |
| 1215 | WLAN_CATEGORY_MESH_PLINK = 30, /* Pending ANA approval */ | ||
| 1216 | WLAN_CATEGORY_MESH_PATH_SEL = 32, /* Pending ANA approval */ | ||
| 1214 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, | 1217 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, |
| 1215 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, | 1218 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, |
| 1216 | }; | 1219 | }; |
| @@ -1324,7 +1327,6 @@ enum ieee80211_back_actioncode { | |||
| 1324 | enum ieee80211_back_parties { | 1327 | enum ieee80211_back_parties { |
| 1325 | WLAN_BACK_RECIPIENT = 0, | 1328 | WLAN_BACK_RECIPIENT = 0, |
| 1326 | WLAN_BACK_INITIATOR = 1, | 1329 | WLAN_BACK_INITIATOR = 1, |
| 1327 | WLAN_BACK_TIMER = 2, | ||
| 1328 | }; | 1330 | }; |
| 1329 | 1331 | ||
| 1330 | /* SA Query action */ | 1332 | /* SA Query action */ |
diff --git a/include/linux/if.h b/include/linux/if.h index 3a9f410a296b..be350e62a905 100644 --- a/include/linux/if.h +++ b/include/linux/if.h | |||
| @@ -71,6 +71,8 @@ | |||
| 71 | * release skb->dst | 71 | * release skb->dst |
| 72 | */ | 72 | */ |
| 73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ | 73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ |
| 74 | #define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */ | ||
| 75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ | ||
| 74 | 76 | ||
| 75 | #define IF_GET_IFACE 0x0001 /* for querying only */ | 77 | #define IF_GET_IFACE 0x0001 /* for querying only */ |
| 76 | #define IF_GET_PROTO 0x0002 | 78 | #define IF_GET_PROTO 0x0002 |
diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index e80b7f88f7c6..6d722f41ee7c 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h | |||
| @@ -90,6 +90,7 @@ | |||
| 90 | 90 | ||
| 91 | #define ARPHRD_PHONET 820 /* PhoNet media type */ | 91 | #define ARPHRD_PHONET 820 /* PhoNet media type */ |
| 92 | #define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ | 92 | #define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ |
| 93 | #define ARPHRD_CAIF 822 /* CAIF media type */ | ||
| 93 | 94 | ||
| 94 | #define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ | 95 | #define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ |
| 95 | #define ARPHRD_NONE 0xFFFE /* zero header length */ | 96 | #define ARPHRD_NONE 0xFFFE /* zero header length */ |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index 299b4121f914..bed7a4682b90 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
| @@ -109,6 +109,7 @@ | |||
| 109 | #define ETH_P_TRAILER 0x001C /* Trailer switch tagging */ | 109 | #define ETH_P_TRAILER 0x001C /* Trailer switch tagging */ |
| 110 | #define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */ | 110 | #define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */ |
| 111 | #define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */ | 111 | #define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */ |
| 112 | #define ETH_P_CAIF 0x00F7 /* ST-Ericsson CAIF protocol */ | ||
| 112 | 113 | ||
| 113 | /* | 114 | /* |
| 114 | * This is an Ethernet frame header. | 115 | * This is an Ethernet frame header. |
diff --git a/include/linux/if_link.h b/include/linux/if_link.h index d94963b379d9..85c812db5a3f 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h | |||
| @@ -37,6 +37,38 @@ struct rtnl_link_stats { | |||
| 37 | __u32 tx_compressed; | 37 | __u32 tx_compressed; |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | struct rtnl_link_stats64 { | ||
| 41 | __u64 rx_packets; /* total packets received */ | ||
| 42 | __u64 tx_packets; /* total packets transmitted */ | ||
| 43 | __u64 rx_bytes; /* total bytes received */ | ||
| 44 | __u64 tx_bytes; /* total bytes transmitted */ | ||
| 45 | __u64 rx_errors; /* bad packets received */ | ||
| 46 | __u64 tx_errors; /* packet transmit problems */ | ||
| 47 | __u64 rx_dropped; /* no space in linux buffers */ | ||
| 48 | __u64 tx_dropped; /* no space available in linux */ | ||
| 49 | __u64 multicast; /* multicast packets received */ | ||
| 50 | __u64 collisions; | ||
| 51 | |||
| 52 | /* detailed rx_errors: */ | ||
| 53 | __u64 rx_length_errors; | ||
| 54 | __u64 rx_over_errors; /* receiver ring buff overflow */ | ||
| 55 | __u64 rx_crc_errors; /* recved pkt with crc error */ | ||
| 56 | __u64 rx_frame_errors; /* recv'd frame alignment error */ | ||
| 57 | __u64 rx_fifo_errors; /* recv'r fifo overrun */ | ||
| 58 | __u64 rx_missed_errors; /* receiver missed packet */ | ||
| 59 | |||
| 60 | /* detailed tx_errors */ | ||
| 61 | __u64 tx_aborted_errors; | ||
| 62 | __u64 tx_carrier_errors; | ||
| 63 | __u64 tx_fifo_errors; | ||
| 64 | __u64 tx_heartbeat_errors; | ||
| 65 | __u64 tx_window_errors; | ||
| 66 | |||
| 67 | /* for cslip etc */ | ||
| 68 | __u64 rx_compressed; | ||
| 69 | __u64 tx_compressed; | ||
| 70 | }; | ||
| 71 | |||
| 40 | /* The struct should be in sync with struct ifmap */ | 72 | /* The struct should be in sync with struct ifmap */ |
| 41 | struct rtnl_link_ifmap { | 73 | struct rtnl_link_ifmap { |
| 42 | __u64 mem_start; | 74 | __u64 mem_start; |
| @@ -80,6 +112,9 @@ enum { | |||
| 80 | IFLA_IFALIAS, | 112 | IFLA_IFALIAS, |
| 81 | IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ | 113 | IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ |
| 82 | IFLA_VFINFO_LIST, | 114 | IFLA_VFINFO_LIST, |
| 115 | IFLA_STATS64, | ||
| 116 | IFLA_VF_PORTS, | ||
| 117 | IFLA_PORT_SELF, | ||
| 83 | __IFLA_MAX | 118 | __IFLA_MAX |
| 84 | }; | 119 | }; |
| 85 | 120 | ||
| @@ -241,4 +276,77 @@ struct ifla_vf_info { | |||
| 241 | __u32 qos; | 276 | __u32 qos; |
| 242 | __u32 tx_rate; | 277 | __u32 tx_rate; |
| 243 | }; | 278 | }; |
| 279 | |||
| 280 | /* VF ports management section | ||
| 281 | * | ||
| 282 | * Nested layout of set/get msg is: | ||
| 283 | * | ||
| 284 | * [IFLA_NUM_VF] | ||
| 285 | * [IFLA_VF_PORTS] | ||
| 286 | * [IFLA_VF_PORT] | ||
| 287 | * [IFLA_PORT_*], ... | ||
| 288 | * [IFLA_VF_PORT] | ||
| 289 | * [IFLA_PORT_*], ... | ||
| 290 | * ... | ||
| 291 | * [IFLA_PORT_SELF] | ||
| 292 | * [IFLA_PORT_*], ... | ||
| 293 | */ | ||
| 294 | |||
| 295 | enum { | ||
| 296 | IFLA_VF_PORT_UNSPEC, | ||
| 297 | IFLA_VF_PORT, /* nest */ | ||
| 298 | __IFLA_VF_PORT_MAX, | ||
| 299 | }; | ||
| 300 | |||
| 301 | #define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) | ||
| 302 | |||
| 303 | enum { | ||
| 304 | IFLA_PORT_UNSPEC, | ||
| 305 | IFLA_PORT_VF, /* __u32 */ | ||
| 306 | IFLA_PORT_PROFILE, /* string */ | ||
| 307 | IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ | ||
| 308 | IFLA_PORT_INSTANCE_UUID, /* binary UUID */ | ||
| 309 | IFLA_PORT_HOST_UUID, /* binary UUID */ | ||
| 310 | IFLA_PORT_REQUEST, /* __u8 */ | ||
| 311 | IFLA_PORT_RESPONSE, /* __u16, output only */ | ||
| 312 | __IFLA_PORT_MAX, | ||
| 313 | }; | ||
| 314 | |||
| 315 | #define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) | ||
| 316 | |||
| 317 | #define PORT_PROFILE_MAX 40 | ||
| 318 | #define PORT_UUID_MAX 16 | ||
| 319 | #define PORT_SELF_VF -1 | ||
| 320 | |||
| 321 | enum { | ||
| 322 | PORT_REQUEST_PREASSOCIATE = 0, | ||
| 323 | PORT_REQUEST_PREASSOCIATE_RR, | ||
| 324 | PORT_REQUEST_ASSOCIATE, | ||
| 325 | PORT_REQUEST_DISASSOCIATE, | ||
| 326 | }; | ||
| 327 | |||
| 328 | enum { | ||
| 329 | PORT_VDP_RESPONSE_SUCCESS = 0, | ||
| 330 | PORT_VDP_RESPONSE_INVALID_FORMAT, | ||
| 331 | PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, | ||
| 332 | PORT_VDP_RESPONSE_UNUSED_VTID, | ||
| 333 | PORT_VDP_RESPONSE_VTID_VIOLATION, | ||
| 334 | PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, | ||
| 335 | PORT_VDP_RESPONSE_OUT_OF_SYNC, | ||
| 336 | /* 0x08-0xFF reserved for future VDP use */ | ||
| 337 | PORT_PROFILE_RESPONSE_SUCCESS = 0x100, | ||
| 338 | PORT_PROFILE_RESPONSE_INPROGRESS, | ||
| 339 | PORT_PROFILE_RESPONSE_INVALID, | ||
| 340 | PORT_PROFILE_RESPONSE_BADSTATE, | ||
| 341 | PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, | ||
| 342 | PORT_PROFILE_RESPONSE_ERROR, | ||
| 343 | }; | ||
| 344 | |||
| 345 | struct ifla_port_vsi { | ||
| 346 | __u8 vsi_mgr_id; | ||
| 347 | __u8 vsi_type_id[3]; | ||
| 348 | __u8 vsi_type_version; | ||
| 349 | __u8 pad[3]; | ||
| 350 | }; | ||
| 351 | |||
| 244 | #endif /* _LINUX_IF_LINK_H */ | 352 | #endif /* _LINUX_IF_LINK_H */ |
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index b78a712247da..9ea047aca795 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h | |||
| @@ -85,6 +85,7 @@ extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, | |||
| 85 | struct net_device *dev); | 85 | struct net_device *dev); |
| 86 | 86 | ||
| 87 | 87 | ||
| 88 | extern struct sk_buff *(*macvlan_handle_frame_hook)(struct sk_buff *); | 88 | extern struct sk_buff *(*macvlan_handle_frame_hook)(struct macvlan_port *, |
| 89 | struct sk_buff *); | ||
| 89 | 90 | ||
| 90 | #endif /* _LINUX_IF_MACVLAN_H */ | 91 | #endif /* _LINUX_IF_MACVLAN_H */ |
diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h index aa57a5f993fc..6ac23ef1801a 100644 --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h | |||
| @@ -47,6 +47,7 @@ struct sockaddr_ll { | |||
| 47 | #define PACKET_TX_RING 13 | 47 | #define PACKET_TX_RING 13 |
| 48 | #define PACKET_LOSS 14 | 48 | #define PACKET_LOSS 14 |
| 49 | #define PACKET_VNET_HDR 15 | 49 | #define PACKET_VNET_HDR 15 |
| 50 | #define PACKET_TX_TIMESTAMP 16 | ||
| 50 | 51 | ||
| 51 | struct tpacket_stats { | 52 | struct tpacket_stats { |
| 52 | unsigned int tp_packets; | 53 | unsigned int tp_packets; |
diff --git a/include/linux/if_pppol2tp.h b/include/linux/if_pppol2tp.h index c58baea4a25b..184bc5566207 100644 --- a/include/linux/if_pppol2tp.h +++ b/include/linux/if_pppol2tp.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Linux PPP over L2TP (PPPoL2TP) Socket Implementation (RFC 2661) | 2 | * Linux PPP over L2TP (PPPoL2TP) Socket Implementation (RFC 2661) |
| 3 | * | 3 | * |
| 4 | * This file supplies definitions required by the PPP over L2TP driver | 4 | * This file supplies definitions required by the PPP over L2TP driver |
| 5 | * (pppol2tp.c). All version information wrt this file is located in pppol2tp.c | 5 | * (l2tp_ppp.c). All version information wrt this file is located in l2tp_ppp.c |
| 6 | * | 6 | * |
| 7 | * License: | 7 | * License: |
| 8 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
| @@ -35,6 +35,20 @@ struct pppol2tp_addr { | |||
| 35 | __u16 d_tunnel, d_session; /* For sending outgoing packets */ | 35 | __u16 d_tunnel, d_session; /* For sending outgoing packets */ |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 | ||
| 39 | * bits. So we need a different sockaddr structure. | ||
| 40 | */ | ||
| 41 | struct pppol2tpv3_addr { | ||
| 42 | pid_t pid; /* pid that owns the fd. | ||
| 43 | * 0 => current */ | ||
| 44 | int fd; /* FD of UDP or IP socket to use */ | ||
| 45 | |||
| 46 | struct sockaddr_in addr; /* IP address and port to send to */ | ||
| 47 | |||
| 48 | __u32 s_tunnel, s_session; /* For matching incoming packets */ | ||
| 49 | __u32 d_tunnel, d_session; /* For sending outgoing packets */ | ||
| 50 | }; | ||
| 51 | |||
| 38 | /* Socket options: | 52 | /* Socket options: |
| 39 | * DEBUG - bitmask of debug message categories | 53 | * DEBUG - bitmask of debug message categories |
| 40 | * SENDSEQ - 0 => don't send packets with sequence numbers | 54 | * SENDSEQ - 0 => don't send packets with sequence numbers |
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index 90b5fae5d714..a6577af0c4e6 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h | |||
| @@ -72,6 +72,15 @@ struct sockaddr_pppol2tp { | |||
| 72 | struct pppol2tp_addr pppol2tp; | 72 | struct pppol2tp_addr pppol2tp; |
| 73 | }__attribute__ ((packed)); | 73 | }__attribute__ ((packed)); |
| 74 | 74 | ||
| 75 | /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 | ||
| 76 | * bits. So we need a different sockaddr structure. | ||
| 77 | */ | ||
| 78 | struct sockaddr_pppol2tpv3 { | ||
| 79 | sa_family_t sa_family; /* address family, AF_PPPOX */ | ||
| 80 | unsigned int sa_protocol; /* protocol identifier */ | ||
| 81 | struct pppol2tpv3_addr pppol2tp; | ||
| 82 | } __attribute__ ((packed)); | ||
| 83 | |||
| 75 | /********************************************************************* | 84 | /********************************************************************* |
| 76 | * | 85 | * |
| 77 | * ioctl interface for defining forwarding of connections | 86 | * ioctl interface for defining forwarding of connections |
diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index 1350a246893a..06b1829731fd 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h | |||
| @@ -51,6 +51,8 @@ | |||
| 51 | #define TUNSETSNDBUF _IOW('T', 212, int) | 51 | #define TUNSETSNDBUF _IOW('T', 212, int) |
| 52 | #define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) | 52 | #define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) |
| 53 | #define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) | 53 | #define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) |
| 54 | #define TUNGETVNETHDRSZ _IOR('T', 215, int) | ||
| 55 | #define TUNSETVNETHDRSZ _IOW('T', 216, int) | ||
| 54 | 56 | ||
| 55 | /* TUNSETIFF ifr flags */ | 57 | /* TUNSETIFF ifr flags */ |
| 56 | #define IFF_TUN 0x0001 | 58 | #define IFF_TUN 0x0001 |
diff --git a/include/linux/if_x25.h b/include/linux/if_x25.h new file mode 100644 index 000000000000..897765f5feb8 --- /dev/null +++ b/include/linux/if_x25.h | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | /* | ||
| 2 | * Linux X.25 packet to device interface | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #ifndef _IF_X25_H | ||
| 16 | #define _IF_X25_H | ||
| 17 | |||
| 18 | #include <linux/types.h> | ||
| 19 | |||
| 20 | /* Documentation/networking/x25-iface.txt */ | ||
| 21 | #define X25_IFACE_DATA 0x00 | ||
| 22 | #define X25_IFACE_CONNECT 0x01 | ||
| 23 | #define X25_IFACE_DISCONNECT 0x02 | ||
| 24 | #define X25_IFACE_PARAMS 0x03 | ||
| 25 | |||
| 26 | #endif /* _IF_X25_H */ | ||
diff --git a/include/linux/in6.h b/include/linux/in6.h index bd55c6e46b2e..c4bf46f764bf 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
| @@ -221,10 +221,10 @@ struct in6_flowlabel_req { | |||
| 221 | #define IPV6_RTHDR 57 | 221 | #define IPV6_RTHDR 57 |
| 222 | #define IPV6_RECVDSTOPTS 58 | 222 | #define IPV6_RECVDSTOPTS 58 |
| 223 | #define IPV6_DSTOPTS 59 | 223 | #define IPV6_DSTOPTS 59 |
| 224 | #if 0 /* not yet */ | ||
| 225 | #define IPV6_RECVPATHMTU 60 | 224 | #define IPV6_RECVPATHMTU 60 |
| 226 | #define IPV6_PATHMTU 61 | 225 | #define IPV6_PATHMTU 61 |
| 227 | #define IPV6_DONTFRAG 62 | 226 | #define IPV6_DONTFRAG 62 |
| 227 | #if 0 /* not yet */ | ||
| 228 | #define IPV6_USE_MIN_MTU 63 | 228 | #define IPV6_USE_MIN_MTU 63 |
| 229 | #endif | 229 | #endif |
| 230 | 230 | ||
| @@ -265,6 +265,9 @@ struct in6_flowlabel_req { | |||
| 265 | #define IPV6_PREFER_SRC_CGA 0x0008 | 265 | #define IPV6_PREFER_SRC_CGA 0x0008 |
| 266 | #define IPV6_PREFER_SRC_NONCGA 0x0800 | 266 | #define IPV6_PREFER_SRC_NONCGA 0x0800 |
| 267 | 267 | ||
| 268 | /* RFC5082: Generalized Ttl Security Mechanism */ | ||
| 269 | #define IPV6_MINHOPCOUNT 73 | ||
| 270 | |||
| 268 | /* | 271 | /* |
| 269 | * Multicast Routing: | 272 | * Multicast Routing: |
| 270 | * see include/linux/mroute6.h. | 273 | * see include/linux/mroute6.h. |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index e0cc9a7db2b5..99e1ab7e3eec 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -21,6 +21,10 @@ struct in6_pktinfo { | |||
| 21 | int ipi6_ifindex; | 21 | int ipi6_ifindex; |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | struct ip6_mtuinfo { | ||
| 25 | struct sockaddr_in6 ip6m_addr; | ||
| 26 | __u32 ip6m_mtu; | ||
| 27 | }; | ||
| 24 | 28 | ||
| 25 | struct in6_ifreq { | 29 | struct in6_ifreq { |
| 26 | struct in6_addr ifr6_addr; | 30 | struct in6_addr ifr6_addr; |
| @@ -250,9 +254,11 @@ struct inet6_skb_parm { | |||
| 250 | 254 | ||
| 251 | #define IP6SKB_XFRM_TRANSFORMED 1 | 255 | #define IP6SKB_XFRM_TRANSFORMED 1 |
| 252 | #define IP6SKB_FORWARDED 2 | 256 | #define IP6SKB_FORWARDED 2 |
| 257 | #define IP6SKB_REROUTED 4 | ||
| 253 | }; | 258 | }; |
| 254 | 259 | ||
| 255 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) | 260 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) |
| 261 | #define IP6CBMTU(skb) ((struct ip6_mtuinfo *)((skb)->cb)) | ||
| 256 | 262 | ||
| 257 | static inline int inet6_iif(const struct sk_buff *skb) | 263 | static inline int inet6_iif(const struct sk_buff *skb) |
| 258 | { | 264 | { |
| @@ -334,21 +340,25 @@ struct ipv6_pinfo { | |||
| 334 | dstopts:1, | 340 | dstopts:1, |
| 335 | odstopts:1, | 341 | odstopts:1, |
| 336 | rxflow:1, | 342 | rxflow:1, |
| 337 | rxtclass:1; | 343 | rxtclass:1, |
| 344 | rxpmtu:1; | ||
| 338 | } bits; | 345 | } bits; |
| 339 | __u16 all; | 346 | __u16 all; |
| 340 | } rxopt; | 347 | } rxopt; |
| 341 | 348 | ||
| 342 | /* sockopt flags */ | 349 | /* sockopt flags */ |
| 343 | __u8 recverr:1, | 350 | __u16 recverr:1, |
| 344 | sndflow:1, | 351 | sndflow:1, |
| 345 | pmtudisc:2, | 352 | pmtudisc:2, |
| 346 | ipv6only:1, | 353 | ipv6only:1, |
| 347 | srcprefs:3; /* 001: prefer temporary address | 354 | srcprefs:3, /* 001: prefer temporary address |
| 348 | * 010: prefer public address | 355 | * 010: prefer public address |
| 349 | * 100: prefer care-of address | 356 | * 100: prefer care-of address |
| 350 | */ | 357 | */ |
| 358 | dontfrag:1; | ||
| 359 | __u8 min_hopcount; | ||
| 351 | __u8 tclass; | 360 | __u8 tclass; |
| 361 | __u8 padding; | ||
| 352 | 362 | ||
| 353 | __u32 dst_cookie; | 363 | __u32 dst_cookie; |
| 354 | 364 | ||
| @@ -358,6 +368,7 @@ struct ipv6_pinfo { | |||
| 358 | 368 | ||
| 359 | struct ipv6_txoptions *opt; | 369 | struct ipv6_txoptions *opt; |
| 360 | struct sk_buff *pktoptions; | 370 | struct sk_buff *pktoptions; |
| 371 | struct sk_buff *rxpmtu; | ||
| 361 | struct { | 372 | struct { |
| 362 | struct ipv6_txoptions *opt; | 373 | struct ipv6_txoptions *opt; |
| 363 | u8 hop_limit; | 374 | u8 hop_limit; |
| @@ -372,6 +383,7 @@ struct raw6_sock { | |||
| 372 | __u32 checksum; /* perform checksum */ | 383 | __u32 checksum; /* perform checksum */ |
| 373 | __u32 offset; /* checksum offset */ | 384 | __u32 offset; /* checksum offset */ |
| 374 | struct icmp6_filter filter; | 385 | struct icmp6_filter filter; |
| 386 | __u32 ip6mr_table; | ||
| 375 | /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */ | 387 | /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */ |
| 376 | struct ipv6_pinfo inet6; | 388 | struct ipv6_pinfo inet6; |
| 377 | }; | 389 | }; |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 9fb1c1299032..fc33af911852 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -4,6 +4,8 @@ | |||
| 4 | /* | 4 | /* |
| 5 | * 'kernel.h' contains some often-used function prototypes etc | 5 | * 'kernel.h' contains some often-used function prototypes etc |
| 6 | */ | 6 | */ |
| 7 | #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) | ||
| 8 | #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) | ||
| 7 | 9 | ||
| 8 | #ifdef __KERNEL__ | 10 | #ifdef __KERNEL__ |
| 9 | 11 | ||
| @@ -37,8 +39,8 @@ extern const char linux_proc_banner[]; | |||
| 37 | 39 | ||
| 38 | #define STACK_MAGIC 0xdeadbeef | 40 | #define STACK_MAGIC 0xdeadbeef |
| 39 | 41 | ||
| 40 | #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) | 42 | #define ALIGN(x, a) __ALIGN_KERNEL((x), (a)) |
| 41 | #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) | 43 | #define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask)) |
| 42 | #define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) | 44 | #define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) |
| 43 | #define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) | 45 | #define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) |
| 44 | 46 | ||
diff --git a/include/linux/ks8842.h b/include/linux/ks8842.h new file mode 100644 index 000000000000..da0341b8ca0a --- /dev/null +++ b/include/linux/ks8842.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | /* | ||
| 2 | * ks8842.h KS8842 platform data struct definition | ||
| 3 | * Copyright (c) 2010 Intel Corporation | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef _LINUX_KS8842_H | ||
| 20 | #define _LINUX_KS8842_H | ||
| 21 | |||
| 22 | #include <linux/if_ether.h> | ||
| 23 | |||
| 24 | /** | ||
| 25 | * struct ks8842_platform_data - Platform data of the KS8842 network driver | ||
| 26 | * @macaddr: The MAC address of the device, set to all 0:s to use the on in | ||
| 27 | * the chip. | ||
| 28 | * | ||
| 29 | */ | ||
| 30 | struct ks8842_platform_data { | ||
| 31 | u8 macaddr[ETH_ALEN]; | ||
| 32 | }; | ||
| 33 | |||
| 34 | #endif | ||
diff --git a/include/linux/l2tp.h b/include/linux/l2tp.h new file mode 100644 index 000000000000..4bdb31df8e72 --- /dev/null +++ b/include/linux/l2tp.h | |||
| @@ -0,0 +1,163 @@ | |||
| 1 | /* | ||
| 2 | * L2TP-over-IP socket for L2TPv3. | ||
| 3 | * | ||
| 4 | * Author: James Chapman <jchapman@katalix.com> | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef _LINUX_L2TP_H_ | ||
| 8 | #define _LINUX_L2TP_H_ | ||
| 9 | |||
| 10 | #include <linux/types.h> | ||
| 11 | #ifdef __KERNEL__ | ||
| 12 | #include <linux/socket.h> | ||
| 13 | #include <linux/in.h> | ||
| 14 | #else | ||
| 15 | #include <netinet/in.h> | ||
| 16 | #endif | ||
| 17 | |||
| 18 | #define IPPROTO_L2TP 115 | ||
| 19 | |||
| 20 | /** | ||
| 21 | * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets | ||
| 22 | * @l2tp_family: address family number AF_L2TPIP. | ||
| 23 | * @l2tp_addr: protocol specific address information | ||
| 24 | * @l2tp_conn_id: connection id of tunnel | ||
| 25 | */ | ||
| 26 | #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ | ||
| 27 | struct sockaddr_l2tpip { | ||
| 28 | /* The first fields must match struct sockaddr_in */ | ||
| 29 | sa_family_t l2tp_family; /* AF_INET */ | ||
| 30 | __be16 l2tp_unused; /* INET port number (unused) */ | ||
| 31 | struct in_addr l2tp_addr; /* Internet address */ | ||
| 32 | |||
| 33 | __u32 l2tp_conn_id; /* Connection ID of tunnel */ | ||
| 34 | |||
| 35 | /* Pad to size of `struct sockaddr'. */ | ||
| 36 | unsigned char __pad[sizeof(struct sockaddr) - sizeof(sa_family_t) - | ||
| 37 | sizeof(__be16) - sizeof(struct in_addr) - | ||
| 38 | sizeof(__u32)]; | ||
| 39 | }; | ||
| 40 | |||
| 41 | /***************************************************************************** | ||
| 42 | * NETLINK_GENERIC netlink family. | ||
| 43 | *****************************************************************************/ | ||
| 44 | |||
| 45 | /* | ||
| 46 | * Commands. | ||
| 47 | * Valid TLVs of each command are:- | ||
| 48 | * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid | ||
| 49 | * TUNNEL_DELETE - CONN_ID | ||
| 50 | * TUNNEL_MODIFY - CONN_ID, udpcsum | ||
| 51 | * TUNNEL_GETSTATS - CONN_ID, (stats) | ||
| 52 | * TUNNEL_GET - CONN_ID, (...) | ||
| 53 | * SESSION_CREATE - SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec | ||
| 54 | * SESSION_DELETE - SESSION_ID | ||
| 55 | * SESSION_MODIFY - SESSION_ID, data_seq | ||
| 56 | * SESSION_GET - SESSION_ID, (...) | ||
| 57 | * SESSION_GETSTATS - SESSION_ID, (stats) | ||
| 58 | * | ||
| 59 | */ | ||
| 60 | enum { | ||
| 61 | L2TP_CMD_NOOP, | ||
| 62 | L2TP_CMD_TUNNEL_CREATE, | ||
| 63 | L2TP_CMD_TUNNEL_DELETE, | ||
| 64 | L2TP_CMD_TUNNEL_MODIFY, | ||
| 65 | L2TP_CMD_TUNNEL_GET, | ||
| 66 | L2TP_CMD_SESSION_CREATE, | ||
| 67 | L2TP_CMD_SESSION_DELETE, | ||
| 68 | L2TP_CMD_SESSION_MODIFY, | ||
| 69 | L2TP_CMD_SESSION_GET, | ||
| 70 | __L2TP_CMD_MAX, | ||
| 71 | }; | ||
| 72 | |||
| 73 | #define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) | ||
| 74 | |||
| 75 | /* | ||
| 76 | * ATTR types defined for L2TP | ||
| 77 | */ | ||
| 78 | enum { | ||
| 79 | L2TP_ATTR_NONE, /* no data */ | ||
| 80 | L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ | ||
| 81 | L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ | ||
| 82 | L2TP_ATTR_OFFSET, /* u16 */ | ||
| 83 | L2TP_ATTR_DATA_SEQ, /* u16 */ | ||
| 84 | L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ | ||
| 85 | L2TP_ATTR_L2SPEC_LEN, /* u8, enum l2tp_l2spec_type */ | ||
| 86 | L2TP_ATTR_PROTO_VERSION, /* u8 */ | ||
| 87 | L2TP_ATTR_IFNAME, /* string */ | ||
| 88 | L2TP_ATTR_CONN_ID, /* u32 */ | ||
| 89 | L2TP_ATTR_PEER_CONN_ID, /* u32 */ | ||
| 90 | L2TP_ATTR_SESSION_ID, /* u32 */ | ||
| 91 | L2TP_ATTR_PEER_SESSION_ID, /* u32 */ | ||
| 92 | L2TP_ATTR_UDP_CSUM, /* u8 */ | ||
| 93 | L2TP_ATTR_VLAN_ID, /* u16 */ | ||
| 94 | L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ | ||
| 95 | L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ | ||
| 96 | L2TP_ATTR_DEBUG, /* u32 */ | ||
| 97 | L2TP_ATTR_RECV_SEQ, /* u8 */ | ||
| 98 | L2TP_ATTR_SEND_SEQ, /* u8 */ | ||
| 99 | L2TP_ATTR_LNS_MODE, /* u8 */ | ||
| 100 | L2TP_ATTR_USING_IPSEC, /* u8 */ | ||
| 101 | L2TP_ATTR_RECV_TIMEOUT, /* msec */ | ||
| 102 | L2TP_ATTR_FD, /* int */ | ||
| 103 | L2TP_ATTR_IP_SADDR, /* u32 */ | ||
| 104 | L2TP_ATTR_IP_DADDR, /* u32 */ | ||
| 105 | L2TP_ATTR_UDP_SPORT, /* u16 */ | ||
| 106 | L2TP_ATTR_UDP_DPORT, /* u16 */ | ||
| 107 | L2TP_ATTR_MTU, /* u16 */ | ||
| 108 | L2TP_ATTR_MRU, /* u16 */ | ||
| 109 | L2TP_ATTR_STATS, /* nested */ | ||
| 110 | __L2TP_ATTR_MAX, | ||
| 111 | }; | ||
| 112 | |||
| 113 | #define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) | ||
| 114 | |||
| 115 | /* Nested in L2TP_ATTR_STATS */ | ||
| 116 | enum { | ||
| 117 | L2TP_ATTR_STATS_NONE, /* no data */ | ||
| 118 | L2TP_ATTR_TX_PACKETS, /* u64 */ | ||
| 119 | L2TP_ATTR_TX_BYTES, /* u64 */ | ||
| 120 | L2TP_ATTR_TX_ERRORS, /* u64 */ | ||
| 121 | L2TP_ATTR_RX_PACKETS, /* u64 */ | ||
| 122 | L2TP_ATTR_RX_BYTES, /* u64 */ | ||
| 123 | L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ | ||
| 124 | L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ | ||
| 125 | L2TP_ATTR_RX_ERRORS, /* u64 */ | ||
| 126 | __L2TP_ATTR_STATS_MAX, | ||
| 127 | }; | ||
| 128 | |||
| 129 | #define L2TP_ATTR_STATS_MAX (__L2TP_ATTR_STATS_MAX - 1) | ||
| 130 | |||
| 131 | enum l2tp_pwtype { | ||
| 132 | L2TP_PWTYPE_NONE = 0x0000, | ||
| 133 | L2TP_PWTYPE_ETH_VLAN = 0x0004, | ||
| 134 | L2TP_PWTYPE_ETH = 0x0005, | ||
| 135 | L2TP_PWTYPE_PPP = 0x0007, | ||
| 136 | L2TP_PWTYPE_PPP_AC = 0x0008, | ||
| 137 | L2TP_PWTYPE_IP = 0x000b, | ||
| 138 | __L2TP_PWTYPE_MAX | ||
| 139 | }; | ||
| 140 | |||
| 141 | enum l2tp_l2spec_type { | ||
| 142 | L2TP_L2SPECTYPE_NONE, | ||
| 143 | L2TP_L2SPECTYPE_DEFAULT, | ||
| 144 | }; | ||
| 145 | |||
| 146 | enum l2tp_encap_type { | ||
| 147 | L2TP_ENCAPTYPE_UDP, | ||
| 148 | L2TP_ENCAPTYPE_IP, | ||
| 149 | }; | ||
| 150 | |||
| 151 | enum l2tp_seqmode { | ||
| 152 | L2TP_SEQ_NONE = 0, | ||
| 153 | L2TP_SEQ_IP = 1, | ||
| 154 | L2TP_SEQ_ALL = 2, | ||
| 155 | }; | ||
| 156 | |||
| 157 | /* | ||
| 158 | * NETLINK_GENERIC related info | ||
| 159 | */ | ||
| 160 | #define L2TP_GENL_NAME "l2tp" | ||
| 161 | #define L2TP_GENL_VERSION 0x1 | ||
| 162 | |||
| 163 | #endif | ||
diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index 0ebaef577ff5..329a8faa6e37 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h | |||
| @@ -94,6 +94,8 @@ | |||
| 94 | 94 | ||
| 95 | #define SDIO_BUS_WIDTH_1BIT 0x00 | 95 | #define SDIO_BUS_WIDTH_1BIT 0x00 |
| 96 | #define SDIO_BUS_WIDTH_4BIT 0x02 | 96 | #define SDIO_BUS_WIDTH_4BIT 0x02 |
| 97 | #define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */ | ||
| 98 | #define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */ | ||
| 97 | 99 | ||
| 98 | #define SDIO_BUS_ASYNC_INT 0x20 | 100 | #define SDIO_BUS_ASYNC_INT 0x20 |
| 99 | 101 | ||
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 56fde4364e4c..007fbaafead0 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
| @@ -474,6 +474,32 @@ struct platform_device_id { | |||
| 474 | __attribute__((aligned(sizeof(kernel_ulong_t)))); | 474 | __attribute__((aligned(sizeof(kernel_ulong_t)))); |
| 475 | }; | 475 | }; |
| 476 | 476 | ||
| 477 | #define MDIO_MODULE_PREFIX "mdio:" | ||
| 478 | |||
| 479 | #define MDIO_ID_FMT "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d" | ||
| 480 | #define MDIO_ID_ARGS(_id) \ | ||
| 481 | (_id)>>31, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1, \ | ||
| 482 | ((_id)>>27) & 1, ((_id)>>26) & 1, ((_id)>>25) & 1, ((_id)>>24) & 1, \ | ||
| 483 | ((_id)>>23) & 1, ((_id)>>22) & 1, ((_id)>>21) & 1, ((_id)>>20) & 1, \ | ||
| 484 | ((_id)>>19) & 1, ((_id)>>18) & 1, ((_id)>>17) & 1, ((_id)>>16) & 1, \ | ||
| 485 | ((_id)>>15) & 1, ((_id)>>14) & 1, ((_id)>>13) & 1, ((_id)>>12) & 1, \ | ||
| 486 | ((_id)>>11) & 1, ((_id)>>10) & 1, ((_id)>>9) & 1, ((_id)>>8) & 1, \ | ||
| 487 | ((_id)>>7) & 1, ((_id)>>6) & 1, ((_id)>>5) & 1, ((_id)>>4) & 1, \ | ||
| 488 | ((_id)>>3) & 1, ((_id)>>2) & 1, ((_id)>>1) & 1, (_id) & 1 | ||
| 489 | |||
| 490 | /** | ||
| 491 | * struct mdio_device_id - identifies PHY devices on an MDIO/MII bus | ||
| 492 | * @phy_id: The result of | ||
| 493 | * (mdio_read(&MII_PHYSID1) << 16 | mdio_read(&PHYSID2)) & @phy_id_mask | ||
| 494 | * for this PHY type | ||
| 495 | * @phy_id_mask: Defines the significant bits of @phy_id. A value of 0 | ||
| 496 | * is used to terminate an array of struct mdio_device_id. | ||
| 497 | */ | ||
| 498 | struct mdio_device_id { | ||
| 499 | __u32 phy_id; | ||
| 500 | __u32 phy_id_mask; | ||
| 501 | }; | ||
| 502 | |||
| 477 | struct zorro_device_id { | 503 | struct zorro_device_id { |
| 478 | __u32 id; /* Device ID or ZORRO_WILDCARD */ | 504 | __u32 id; /* Device ID or ZORRO_WILDCARD */ |
| 479 | kernel_ulong_t driver_data; /* Data private to the driver */ | 505 | kernel_ulong_t driver_data; /* Data private to the driver */ |
diff --git a/include/linux/mroute.h b/include/linux/mroute.h index c5f3d53548e2..fa04b246c9ae 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h | |||
| @@ -27,7 +27,8 @@ | |||
| 27 | #define MRT_DEL_MFC (MRT_BASE+5) /* Delete a multicast forwarding entry */ | 27 | #define MRT_DEL_MFC (MRT_BASE+5) /* Delete a multicast forwarding entry */ |
| 28 | #define MRT_VERSION (MRT_BASE+6) /* Get the kernel multicast version */ | 28 | #define MRT_VERSION (MRT_BASE+6) /* Get the kernel multicast version */ |
| 29 | #define MRT_ASSERT (MRT_BASE+7) /* Activate PIM assert mode */ | 29 | #define MRT_ASSERT (MRT_BASE+7) /* Activate PIM assert mode */ |
| 30 | #define MRT_PIM (MRT_BASE+8) /* enable PIM code */ | 30 | #define MRT_PIM (MRT_BASE+8) /* enable PIM code */ |
| 31 | #define MRT_TABLE (MRT_BASE+9) /* Specify mroute table ID */ | ||
| 31 | 32 | ||
| 32 | #define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ | 33 | #define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ |
| 33 | #define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) | 34 | #define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) |
| @@ -191,10 +192,7 @@ struct vif_device { | |||
| 191 | #define VIFF_STATIC 0x8000 | 192 | #define VIFF_STATIC 0x8000 |
| 192 | 193 | ||
| 193 | struct mfc_cache { | 194 | struct mfc_cache { |
| 194 | struct mfc_cache *next; /* Next entry on cache line */ | 195 | struct list_head list; |
| 195 | #ifdef CONFIG_NET_NS | ||
| 196 | struct net *mfc_net; | ||
| 197 | #endif | ||
| 198 | __be32 mfc_mcastgrp; /* Group the entry belongs to */ | 196 | __be32 mfc_mcastgrp; /* Group the entry belongs to */ |
| 199 | __be32 mfc_origin; /* Source of packet */ | 197 | __be32 mfc_origin; /* Source of packet */ |
| 200 | vifi_t mfc_parent; /* Source interface */ | 198 | vifi_t mfc_parent; /* Source interface */ |
| @@ -217,18 +215,6 @@ struct mfc_cache { | |||
| 217 | } mfc_un; | 215 | } mfc_un; |
| 218 | }; | 216 | }; |
| 219 | 217 | ||
| 220 | static inline | ||
| 221 | struct net *mfc_net(const struct mfc_cache *mfc) | ||
| 222 | { | ||
| 223 | return read_pnet(&mfc->mfc_net); | ||
| 224 | } | ||
| 225 | |||
| 226 | static inline | ||
| 227 | void mfc_net_set(struct mfc_cache *mfc, struct net *net) | ||
| 228 | { | ||
| 229 | write_pnet(&mfc->mfc_net, hold_net(net)); | ||
| 230 | } | ||
| 231 | |||
| 232 | #define MFC_STATIC 1 | 218 | #define MFC_STATIC 1 |
| 233 | #define MFC_NOTIFY 2 | 219 | #define MFC_NOTIFY 2 |
| 234 | 220 | ||
diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index 2caa1a8e525d..6091ab77f388 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h | |||
| @@ -24,7 +24,8 @@ | |||
| 24 | #define MRT6_DEL_MFC (MRT6_BASE+5) /* Delete a multicast forwarding entry */ | 24 | #define MRT6_DEL_MFC (MRT6_BASE+5) /* Delete a multicast forwarding entry */ |
| 25 | #define MRT6_VERSION (MRT6_BASE+6) /* Get the kernel multicast version */ | 25 | #define MRT6_VERSION (MRT6_BASE+6) /* Get the kernel multicast version */ |
| 26 | #define MRT6_ASSERT (MRT6_BASE+7) /* Activate PIM assert mode */ | 26 | #define MRT6_ASSERT (MRT6_BASE+7) /* Activate PIM assert mode */ |
| 27 | #define MRT6_PIM (MRT6_BASE+8) /* enable PIM code */ | 27 | #define MRT6_PIM (MRT6_BASE+8) /* enable PIM code */ |
| 28 | #define MRT6_TABLE (MRT6_BASE+9) /* Specify mroute table ID */ | ||
| 28 | 29 | ||
| 29 | #define SIOCGETMIFCNT_IN6 SIOCPROTOPRIVATE /* IP protocol privates */ | 30 | #define SIOCGETMIFCNT_IN6 SIOCPROTOPRIVATE /* IP protocol privates */ |
| 30 | #define SIOCGETSGCNT_IN6 (SIOCPROTOPRIVATE+1) | 31 | #define SIOCGETSGCNT_IN6 (SIOCPROTOPRIVATE+1) |
| @@ -182,10 +183,7 @@ struct mif_device { | |||
| 182 | #define VIFF_STATIC 0x8000 | 183 | #define VIFF_STATIC 0x8000 |
| 183 | 184 | ||
| 184 | struct mfc6_cache { | 185 | struct mfc6_cache { |
| 185 | struct mfc6_cache *next; /* Next entry on cache line */ | 186 | struct list_head list; |
| 186 | #ifdef CONFIG_NET_NS | ||
| 187 | struct net *mfc6_net; | ||
| 188 | #endif | ||
| 189 | struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */ | 187 | struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */ |
| 190 | struct in6_addr mf6c_origin; /* Source of packet */ | 188 | struct in6_addr mf6c_origin; /* Source of packet */ |
| 191 | mifi_t mf6c_parent; /* Source interface */ | 189 | mifi_t mf6c_parent; /* Source interface */ |
| @@ -208,18 +206,6 @@ struct mfc6_cache { | |||
| 208 | } mfc_un; | 206 | } mfc_un; |
| 209 | }; | 207 | }; |
| 210 | 208 | ||
| 211 | static inline | ||
| 212 | struct net *mfc6_net(const struct mfc6_cache *mfc) | ||
| 213 | { | ||
| 214 | return read_pnet(&mfc->mfc6_net); | ||
| 215 | } | ||
| 216 | |||
| 217 | static inline | ||
| 218 | void mfc6_net_set(struct mfc6_cache *mfc, struct net *net) | ||
| 219 | { | ||
| 220 | write_pnet(&mfc->mfc6_net, hold_net(net)); | ||
| 221 | } | ||
| 222 | |||
| 223 | #define MFC_STATIC 1 | 209 | #define MFC_STATIC 1 |
| 224 | #define MFC_NOTIFY 2 | 210 | #define MFC_NOTIFY 2 |
| 225 | 211 | ||
| @@ -244,14 +230,17 @@ extern int ip6mr_get_route(struct net *net, struct sk_buff *skb, | |||
| 244 | struct rtmsg *rtm, int nowait); | 230 | struct rtmsg *rtm, int nowait); |
| 245 | 231 | ||
| 246 | #ifdef CONFIG_IPV6_MROUTE | 232 | #ifdef CONFIG_IPV6_MROUTE |
| 247 | static inline struct sock *mroute6_socket(struct net *net) | 233 | extern struct sock *mroute6_socket(struct net *net, struct sk_buff *skb); |
| 248 | { | ||
| 249 | return net->ipv6.mroute6_sk; | ||
| 250 | } | ||
| 251 | extern int ip6mr_sk_done(struct sock *sk); | 234 | extern int ip6mr_sk_done(struct sock *sk); |
| 252 | #else | 235 | #else |
| 253 | static inline struct sock *mroute6_socket(struct net *net) { return NULL; } | 236 | static inline struct sock *mroute6_socket(struct net *net, struct sk_buff *skb) |
| 254 | static inline int ip6mr_sk_done(struct sock *sk) { return 0; } | 237 | { |
| 238 | return NULL; | ||
| 239 | } | ||
| 240 | static inline int ip6mr_sk_done(struct sock *sk) | ||
| 241 | { | ||
| 242 | return 0; | ||
| 243 | } | ||
| 255 | #endif | 244 | #endif |
| 256 | #endif | 245 | #endif |
| 257 | 246 | ||
diff --git a/include/linux/net.h b/include/linux/net.h index 4157b5d42bd6..2b4deeeb8646 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -59,6 +59,7 @@ typedef enum { | |||
| 59 | #include <linux/wait.h> | 59 | #include <linux/wait.h> |
| 60 | #include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */ | 60 | #include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */ |
| 61 | #include <linux/kmemcheck.h> | 61 | #include <linux/kmemcheck.h> |
| 62 | #include <linux/rcupdate.h> | ||
| 62 | 63 | ||
| 63 | struct poll_table_struct; | 64 | struct poll_table_struct; |
| 64 | struct pipe_inode_info; | 65 | struct pipe_inode_info; |
| @@ -116,6 +117,12 @@ enum sock_shutdown_cmd { | |||
| 116 | SHUT_RDWR = 2, | 117 | SHUT_RDWR = 2, |
| 117 | }; | 118 | }; |
| 118 | 119 | ||
| 120 | struct socket_wq { | ||
| 121 | wait_queue_head_t wait; | ||
| 122 | struct fasync_struct *fasync_list; | ||
| 123 | struct rcu_head rcu; | ||
| 124 | } ____cacheline_aligned_in_smp; | ||
| 125 | |||
| 119 | /** | 126 | /** |
| 120 | * struct socket - general BSD socket | 127 | * struct socket - general BSD socket |
| 121 | * @state: socket state (%SS_CONNECTED, etc) | 128 | * @state: socket state (%SS_CONNECTED, etc) |
| @@ -135,11 +142,8 @@ struct socket { | |||
| 135 | kmemcheck_bitfield_end(type); | 142 | kmemcheck_bitfield_end(type); |
| 136 | 143 | ||
| 137 | unsigned long flags; | 144 | unsigned long flags; |
| 138 | /* | 145 | |
| 139 | * Please keep fasync_list & wait fields in the same cache line | 146 | struct socket_wq *wq; |
| 140 | */ | ||
| 141 | struct fasync_struct *fasync_list; | ||
| 142 | wait_queue_head_t wait; | ||
| 143 | 147 | ||
| 144 | struct file *file; | 148 | struct file *file; |
| 145 | struct sock *sk; | 149 | struct sock *sk; |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 3857517f1ca5..a1bff6518166 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -219,34 +219,6 @@ struct neighbour; | |||
| 219 | struct neigh_parms; | 219 | struct neigh_parms; |
| 220 | struct sk_buff; | 220 | struct sk_buff; |
| 221 | 221 | ||
| 222 | struct netif_rx_stats { | ||
| 223 | unsigned total; | ||
| 224 | unsigned dropped; | ||
| 225 | unsigned time_squeeze; | ||
| 226 | unsigned cpu_collision; | ||
| 227 | }; | ||
| 228 | |||
| 229 | DECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat); | ||
| 230 | |||
| 231 | struct dev_addr_list { | ||
| 232 | struct dev_addr_list *next; | ||
| 233 | u8 da_addr[MAX_ADDR_LEN]; | ||
| 234 | u8 da_addrlen; | ||
| 235 | u8 da_synced; | ||
| 236 | int da_users; | ||
| 237 | int da_gusers; | ||
| 238 | }; | ||
| 239 | |||
| 240 | /* | ||
| 241 | * We tag multicasts with these structures. | ||
| 242 | */ | ||
| 243 | |||
| 244 | #define dev_mc_list dev_addr_list | ||
| 245 | #define dmi_addr da_addr | ||
| 246 | #define dmi_addrlen da_addrlen | ||
| 247 | #define dmi_users da_users | ||
| 248 | #define dmi_gusers da_gusers | ||
| 249 | |||
| 250 | struct netdev_hw_addr { | 222 | struct netdev_hw_addr { |
| 251 | struct list_head list; | 223 | struct list_head list; |
| 252 | unsigned char addr[MAX_ADDR_LEN]; | 224 | unsigned char addr[MAX_ADDR_LEN]; |
| @@ -255,8 +227,10 @@ struct netdev_hw_addr { | |||
| 255 | #define NETDEV_HW_ADDR_T_SAN 2 | 227 | #define NETDEV_HW_ADDR_T_SAN 2 |
| 256 | #define NETDEV_HW_ADDR_T_SLAVE 3 | 228 | #define NETDEV_HW_ADDR_T_SLAVE 3 |
| 257 | #define NETDEV_HW_ADDR_T_UNICAST 4 | 229 | #define NETDEV_HW_ADDR_T_UNICAST 4 |
| 230 | #define NETDEV_HW_ADDR_T_MULTICAST 5 | ||
| 258 | int refcount; | 231 | int refcount; |
| 259 | bool synced; | 232 | bool synced; |
| 233 | bool global_use; | ||
| 260 | struct rcu_head rcu_head; | 234 | struct rcu_head rcu_head; |
| 261 | }; | 235 | }; |
| 262 | 236 | ||
| @@ -265,16 +239,20 @@ struct netdev_hw_addr_list { | |||
| 265 | int count; | 239 | int count; |
| 266 | }; | 240 | }; |
| 267 | 241 | ||
| 268 | #define netdev_uc_count(dev) ((dev)->uc.count) | 242 | #define netdev_hw_addr_list_count(l) ((l)->count) |
| 269 | #define netdev_uc_empty(dev) ((dev)->uc.count == 0) | 243 | #define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0) |
| 270 | #define netdev_for_each_uc_addr(ha, dev) \ | 244 | #define netdev_hw_addr_list_for_each(ha, l) \ |
| 271 | list_for_each_entry(ha, &dev->uc.list, list) | 245 | list_for_each_entry(ha, &(l)->list, list) |
| 272 | 246 | ||
| 273 | #define netdev_mc_count(dev) ((dev)->mc_count) | 247 | #define netdev_uc_count(dev) netdev_hw_addr_list_count(&(dev)->uc) |
| 274 | #define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0) | 248 | #define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc) |
| 249 | #define netdev_for_each_uc_addr(ha, dev) \ | ||
| 250 | netdev_hw_addr_list_for_each(ha, &(dev)->uc) | ||
| 275 | 251 | ||
| 276 | #define netdev_for_each_mc_addr(mclist, dev) \ | 252 | #define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc) |
| 277 | for (mclist = dev->mc_list; mclist; mclist = mclist->next) | 253 | #define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc) |
| 254 | #define netdev_for_each_mc_addr(ha, dev) \ | ||
| 255 | netdev_hw_addr_list_for_each(ha, &(dev)->mc) | ||
| 278 | 256 | ||
| 279 | struct hh_cache { | 257 | struct hh_cache { |
| 280 | struct hh_cache *hh_next; /* Next entry */ | 258 | struct hh_cache *hh_next; /* Next entry */ |
| @@ -531,6 +509,85 @@ struct netdev_queue { | |||
| 531 | unsigned long tx_dropped; | 509 | unsigned long tx_dropped; |
| 532 | } ____cacheline_aligned_in_smp; | 510 | } ____cacheline_aligned_in_smp; |
| 533 | 511 | ||
| 512 | #ifdef CONFIG_RPS | ||
| 513 | /* | ||
| 514 | * This structure holds an RPS map which can be of variable length. The | ||
| 515 | * map is an array of CPUs. | ||
| 516 | */ | ||
| 517 | struct rps_map { | ||
| 518 | unsigned int len; | ||
| 519 | struct rcu_head rcu; | ||
| 520 | u16 cpus[0]; | ||
| 521 | }; | ||
| 522 | #define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) | ||
| 523 | |||
| 524 | /* | ||
| 525 | * The rps_dev_flow structure contains the mapping of a flow to a CPU and the | ||
| 526 | * tail pointer for that CPU's input queue at the time of last enqueue. | ||
| 527 | */ | ||
| 528 | struct rps_dev_flow { | ||
| 529 | u16 cpu; | ||
| 530 | u16 fill; | ||
| 531 | unsigned int last_qtail; | ||
| 532 | }; | ||
| 533 | |||
| 534 | /* | ||
| 535 | * The rps_dev_flow_table structure contains a table of flow mappings. | ||
| 536 | */ | ||
| 537 | struct rps_dev_flow_table { | ||
| 538 | unsigned int mask; | ||
| 539 | struct rcu_head rcu; | ||
| 540 | struct work_struct free_work; | ||
| 541 | struct rps_dev_flow flows[0]; | ||
| 542 | }; | ||
| 543 | #define RPS_DEV_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_dev_flow_table) + \ | ||
| 544 | (_num * sizeof(struct rps_dev_flow))) | ||
| 545 | |||
| 546 | /* | ||
| 547 | * The rps_sock_flow_table contains mappings of flows to the last CPU | ||
| 548 | * on which they were processed by the application (set in recvmsg). | ||
| 549 | */ | ||
| 550 | struct rps_sock_flow_table { | ||
| 551 | unsigned int mask; | ||
| 552 | u16 ents[0]; | ||
| 553 | }; | ||
| 554 | #define RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \ | ||
| 555 | (_num * sizeof(u16))) | ||
| 556 | |||
| 557 | #define RPS_NO_CPU 0xffff | ||
| 558 | |||
| 559 | static inline void rps_record_sock_flow(struct rps_sock_flow_table *table, | ||
| 560 | u32 hash) | ||
| 561 | { | ||
| 562 | if (table && hash) { | ||
| 563 | unsigned int cpu, index = hash & table->mask; | ||
| 564 | |||
| 565 | /* We only give a hint, preemption can change cpu under us */ | ||
| 566 | cpu = raw_smp_processor_id(); | ||
| 567 | |||
| 568 | if (table->ents[index] != cpu) | ||
| 569 | table->ents[index] = cpu; | ||
| 570 | } | ||
| 571 | } | ||
| 572 | |||
| 573 | static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | ||
| 574 | u32 hash) | ||
| 575 | { | ||
| 576 | if (table && hash) | ||
| 577 | table->ents[hash & table->mask] = RPS_NO_CPU; | ||
| 578 | } | ||
| 579 | |||
| 580 | extern struct rps_sock_flow_table *rps_sock_flow_table; | ||
| 581 | |||
| 582 | /* This structure contains an instance of an RX queue. */ | ||
| 583 | struct netdev_rx_queue { | ||
| 584 | struct rps_map *rps_map; | ||
| 585 | struct rps_dev_flow_table *rps_flow_table; | ||
| 586 | struct kobject kobj; | ||
| 587 | struct netdev_rx_queue *first; | ||
| 588 | atomic_t count; | ||
| 589 | } ____cacheline_aligned_in_smp; | ||
| 590 | #endif /* CONFIG_RPS */ | ||
| 534 | 591 | ||
| 535 | /* | 592 | /* |
| 536 | * This structure defines the management hooks for network devices. | 593 | * This structure defines the management hooks for network devices. |
| @@ -630,6 +687,9 @@ struct netdev_queue { | |||
| 630 | * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate); | 687 | * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate); |
| 631 | * int (*ndo_get_vf_config)(struct net_device *dev, | 688 | * int (*ndo_get_vf_config)(struct net_device *dev, |
| 632 | * int vf, struct ifla_vf_info *ivf); | 689 | * int vf, struct ifla_vf_info *ivf); |
| 690 | * int (*ndo_set_vf_port)(struct net_device *dev, int vf, | ||
| 691 | * struct nlattr *port[]); | ||
| 692 | * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb); | ||
| 633 | */ | 693 | */ |
| 634 | #define HAVE_NET_DEVICE_OPS | 694 | #define HAVE_NET_DEVICE_OPS |
| 635 | struct net_device_ops { | 695 | struct net_device_ops { |
| @@ -668,6 +728,7 @@ struct net_device_ops { | |||
| 668 | unsigned short vid); | 728 | unsigned short vid); |
| 669 | #ifdef CONFIG_NET_POLL_CONTROLLER | 729 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 670 | void (*ndo_poll_controller)(struct net_device *dev); | 730 | void (*ndo_poll_controller)(struct net_device *dev); |
| 731 | void (*ndo_netpoll_cleanup)(struct net_device *dev); | ||
| 671 | #endif | 732 | #endif |
| 672 | int (*ndo_set_vf_mac)(struct net_device *dev, | 733 | int (*ndo_set_vf_mac)(struct net_device *dev, |
| 673 | int queue, u8 *mac); | 734 | int queue, u8 *mac); |
| @@ -678,6 +739,11 @@ struct net_device_ops { | |||
| 678 | int (*ndo_get_vf_config)(struct net_device *dev, | 739 | int (*ndo_get_vf_config)(struct net_device *dev, |
| 679 | int vf, | 740 | int vf, |
| 680 | struct ifla_vf_info *ivf); | 741 | struct ifla_vf_info *ivf); |
| 742 | int (*ndo_set_vf_port)(struct net_device *dev, | ||
| 743 | int vf, | ||
| 744 | struct nlattr *port[]); | ||
| 745 | int (*ndo_get_vf_port)(struct net_device *dev, | ||
| 746 | int vf, struct sk_buff *skb); | ||
| 681 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 747 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
| 682 | int (*ndo_fcoe_enable)(struct net_device *dev); | 748 | int (*ndo_fcoe_enable)(struct net_device *dev); |
| 683 | int (*ndo_fcoe_disable)(struct net_device *dev); | 749 | int (*ndo_fcoe_disable)(struct net_device *dev); |
| @@ -768,6 +834,7 @@ struct net_device { | |||
| 768 | #define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */ | 834 | #define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */ |
| 769 | #define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ | 835 | #define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ |
| 770 | #define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ | 836 | #define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ |
| 837 | #define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */ | ||
| 771 | 838 | ||
| 772 | /* Segmentation offload features */ | 839 | /* Segmentation offload features */ |
| 773 | #define NETIF_F_GSO_SHIFT 16 | 840 | #define NETIF_F_GSO_SHIFT 16 |
| @@ -824,7 +891,7 @@ struct net_device { | |||
| 824 | unsigned char operstate; /* RFC2863 operstate */ | 891 | unsigned char operstate; /* RFC2863 operstate */ |
| 825 | unsigned char link_mode; /* mapping policy to operstate */ | 892 | unsigned char link_mode; /* mapping policy to operstate */ |
| 826 | 893 | ||
| 827 | unsigned mtu; /* interface MTU value */ | 894 | unsigned int mtu; /* interface MTU value */ |
| 828 | unsigned short type; /* interface hardware type */ | 895 | unsigned short type; /* interface hardware type */ |
| 829 | unsigned short hard_header_len; /* hardware hdr length */ | 896 | unsigned short hard_header_len; /* hardware hdr length */ |
| 830 | 897 | ||
| @@ -844,12 +911,10 @@ struct net_device { | |||
| 844 | unsigned char addr_len; /* hardware address length */ | 911 | unsigned char addr_len; /* hardware address length */ |
| 845 | unsigned short dev_id; /* for shared network cards */ | 912 | unsigned short dev_id; /* for shared network cards */ |
| 846 | 913 | ||
| 847 | struct netdev_hw_addr_list uc; /* Secondary unicast | ||
| 848 | mac addresses */ | ||
| 849 | int uc_promisc; | ||
| 850 | spinlock_t addr_list_lock; | 914 | spinlock_t addr_list_lock; |
| 851 | struct dev_addr_list *mc_list; /* Multicast mac addresses */ | 915 | struct netdev_hw_addr_list uc; /* Unicast mac addresses */ |
| 852 | int mc_count; /* Number of installed mcasts */ | 916 | struct netdev_hw_addr_list mc; /* Multicast mac addresses */ |
| 917 | int uc_promisc; | ||
| 853 | unsigned int promiscuity; | 918 | unsigned int promiscuity; |
| 854 | unsigned int allmulti; | 919 | unsigned int allmulti; |
| 855 | 920 | ||
| @@ -882,6 +947,15 @@ struct net_device { | |||
| 882 | 947 | ||
| 883 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ | 948 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ |
| 884 | 949 | ||
| 950 | #ifdef CONFIG_RPS | ||
| 951 | struct kset *queues_kset; | ||
| 952 | |||
| 953 | struct netdev_rx_queue *_rx; | ||
| 954 | |||
| 955 | /* Number of RX queues allocated at alloc_netdev_mq() time */ | ||
| 956 | unsigned int num_rx_queues; | ||
| 957 | #endif | ||
| 958 | |||
| 885 | struct netdev_queue rx_queue; | 959 | struct netdev_queue rx_queue; |
| 886 | 960 | ||
| 887 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; | 961 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; |
| @@ -1310,19 +1384,44 @@ static inline int unregister_gifconf(unsigned int family) | |||
| 1310 | } | 1384 | } |
| 1311 | 1385 | ||
| 1312 | /* | 1386 | /* |
| 1313 | * Incoming packets are placed on per-cpu queues so that | 1387 | * Incoming packets are placed on per-cpu queues |
| 1314 | * no locking is needed. | ||
| 1315 | */ | 1388 | */ |
| 1316 | struct softnet_data { | 1389 | struct softnet_data { |
| 1317 | struct Qdisc *output_queue; | 1390 | struct Qdisc *output_queue; |
| 1318 | struct sk_buff_head input_pkt_queue; | 1391 | struct Qdisc **output_queue_tailp; |
| 1319 | struct list_head poll_list; | 1392 | struct list_head poll_list; |
| 1320 | struct sk_buff *completion_queue; | 1393 | struct sk_buff *completion_queue; |
| 1321 | 1394 | struct sk_buff_head process_queue; | |
| 1395 | |||
| 1396 | /* stats */ | ||
| 1397 | unsigned int processed; | ||
| 1398 | unsigned int time_squeeze; | ||
| 1399 | unsigned int cpu_collision; | ||
| 1400 | unsigned int received_rps; | ||
| 1401 | |||
| 1402 | #ifdef CONFIG_RPS | ||
| 1403 | struct softnet_data *rps_ipi_list; | ||
| 1404 | |||
| 1405 | /* Elements below can be accessed between CPUs for RPS */ | ||
| 1406 | struct call_single_data csd ____cacheline_aligned_in_smp; | ||
| 1407 | struct softnet_data *rps_ipi_next; | ||
| 1408 | unsigned int cpu; | ||
| 1409 | unsigned int input_queue_head; | ||
| 1410 | #endif | ||
| 1411 | unsigned dropped; | ||
| 1412 | struct sk_buff_head input_pkt_queue; | ||
| 1322 | struct napi_struct backlog; | 1413 | struct napi_struct backlog; |
| 1323 | }; | 1414 | }; |
| 1324 | 1415 | ||
| 1325 | DECLARE_PER_CPU(struct softnet_data,softnet_data); | 1416 | static inline void input_queue_head_add(struct softnet_data *sd, |
| 1417 | unsigned int len) | ||
| 1418 | { | ||
| 1419 | #ifdef CONFIG_RPS | ||
| 1420 | sd->input_queue_head += len; | ||
| 1421 | #endif | ||
| 1422 | } | ||
| 1423 | |||
| 1424 | DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data); | ||
| 1326 | 1425 | ||
| 1327 | #define HAVE_NETIF_QUEUE | 1426 | #define HAVE_NETIF_QUEUE |
| 1328 | 1427 | ||
| @@ -1949,6 +2048,22 @@ extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
| 1949 | extern int register_netdev(struct net_device *dev); | 2048 | extern int register_netdev(struct net_device *dev); |
| 1950 | extern void unregister_netdev(struct net_device *dev); | 2049 | extern void unregister_netdev(struct net_device *dev); |
| 1951 | 2050 | ||
| 2051 | /* General hardware address lists handling functions */ | ||
| 2052 | extern int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, | ||
| 2053 | struct netdev_hw_addr_list *from_list, | ||
| 2054 | int addr_len, unsigned char addr_type); | ||
| 2055 | extern void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, | ||
| 2056 | struct netdev_hw_addr_list *from_list, | ||
| 2057 | int addr_len, unsigned char addr_type); | ||
| 2058 | extern int __hw_addr_sync(struct netdev_hw_addr_list *to_list, | ||
| 2059 | struct netdev_hw_addr_list *from_list, | ||
| 2060 | int addr_len); | ||
| 2061 | extern void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, | ||
| 2062 | struct netdev_hw_addr_list *from_list, | ||
| 2063 | int addr_len); | ||
| 2064 | extern void __hw_addr_flush(struct netdev_hw_addr_list *list); | ||
| 2065 | extern void __hw_addr_init(struct netdev_hw_addr_list *list); | ||
| 2066 | |||
| 1952 | /* Functions used for device addresses handling */ | 2067 | /* Functions used for device addresses handling */ |
| 1953 | extern int dev_addr_add(struct net_device *dev, unsigned char *addr, | 2068 | extern int dev_addr_add(struct net_device *dev, unsigned char *addr, |
| 1954 | unsigned char addr_type); | 2069 | unsigned char addr_type); |
| @@ -1960,26 +2075,34 @@ extern int dev_addr_add_multiple(struct net_device *to_dev, | |||
| 1960 | extern int dev_addr_del_multiple(struct net_device *to_dev, | 2075 | extern int dev_addr_del_multiple(struct net_device *to_dev, |
| 1961 | struct net_device *from_dev, | 2076 | struct net_device *from_dev, |
| 1962 | unsigned char addr_type); | 2077 | unsigned char addr_type); |
| 2078 | extern void dev_addr_flush(struct net_device *dev); | ||
| 2079 | extern int dev_addr_init(struct net_device *dev); | ||
| 2080 | |||
| 2081 | /* Functions used for unicast addresses handling */ | ||
| 2082 | extern int dev_uc_add(struct net_device *dev, unsigned char *addr); | ||
| 2083 | extern int dev_uc_del(struct net_device *dev, unsigned char *addr); | ||
| 2084 | extern int dev_uc_sync(struct net_device *to, struct net_device *from); | ||
| 2085 | extern void dev_uc_unsync(struct net_device *to, struct net_device *from); | ||
| 2086 | extern void dev_uc_flush(struct net_device *dev); | ||
| 2087 | extern void dev_uc_init(struct net_device *dev); | ||
| 2088 | |||
| 2089 | /* Functions used for multicast addresses handling */ | ||
| 2090 | extern int dev_mc_add(struct net_device *dev, unsigned char *addr); | ||
| 2091 | extern int dev_mc_add_global(struct net_device *dev, unsigned char *addr); | ||
| 2092 | extern int dev_mc_del(struct net_device *dev, unsigned char *addr); | ||
| 2093 | extern int dev_mc_del_global(struct net_device *dev, unsigned char *addr); | ||
| 2094 | extern int dev_mc_sync(struct net_device *to, struct net_device *from); | ||
| 2095 | extern void dev_mc_unsync(struct net_device *to, struct net_device *from); | ||
| 2096 | extern void dev_mc_flush(struct net_device *dev); | ||
| 2097 | extern void dev_mc_init(struct net_device *dev); | ||
| 1963 | 2098 | ||
| 1964 | /* Functions used for secondary unicast and multicast support */ | 2099 | /* Functions used for secondary unicast and multicast support */ |
| 1965 | extern void dev_set_rx_mode(struct net_device *dev); | 2100 | extern void dev_set_rx_mode(struct net_device *dev); |
| 1966 | extern void __dev_set_rx_mode(struct net_device *dev); | 2101 | extern void __dev_set_rx_mode(struct net_device *dev); |
| 1967 | extern int dev_unicast_delete(struct net_device *dev, void *addr); | ||
| 1968 | extern int dev_unicast_add(struct net_device *dev, void *addr); | ||
| 1969 | extern int dev_unicast_sync(struct net_device *to, struct net_device *from); | ||
| 1970 | extern void dev_unicast_unsync(struct net_device *to, struct net_device *from); | ||
| 1971 | extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); | ||
| 1972 | extern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly); | ||
| 1973 | extern int dev_mc_sync(struct net_device *to, struct net_device *from); | ||
| 1974 | extern void dev_mc_unsync(struct net_device *to, struct net_device *from); | ||
| 1975 | extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all); | ||
| 1976 | extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly); | ||
| 1977 | extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); | ||
| 1978 | extern void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); | ||
| 1979 | extern int dev_set_promiscuity(struct net_device *dev, int inc); | 2102 | extern int dev_set_promiscuity(struct net_device *dev, int inc); |
| 1980 | extern int dev_set_allmulti(struct net_device *dev, int inc); | 2103 | extern int dev_set_allmulti(struct net_device *dev, int inc); |
| 1981 | extern void netdev_state_change(struct net_device *dev); | 2104 | extern void netdev_state_change(struct net_device *dev); |
| 1982 | extern void netdev_bonding_change(struct net_device *dev, | 2105 | extern int netdev_bonding_change(struct net_device *dev, |
| 1983 | unsigned long event); | 2106 | unsigned long event); |
| 1984 | extern void netdev_features_change(struct net_device *dev); | 2107 | extern void netdev_features_change(struct net_device *dev); |
| 1985 | /* Load a device via the kmod */ | 2108 | /* Load a device via the kmod */ |
| @@ -1989,6 +2112,7 @@ extern const struct net_device_stats *dev_get_stats(struct net_device *dev); | |||
| 1989 | extern void dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats); | 2112 | extern void dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats); |
| 1990 | 2113 | ||
| 1991 | extern int netdev_max_backlog; | 2114 | extern int netdev_max_backlog; |
| 2115 | extern int netdev_tstamp_prequeue; | ||
| 1992 | extern int weight_p; | 2116 | extern int weight_p; |
| 1993 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); | 2117 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); |
| 1994 | extern int skb_checksum_help(struct sk_buff *skb); | 2118 | extern int skb_checksum_help(struct sk_buff *skb); |
| @@ -2049,54 +2173,14 @@ static inline void netif_set_gso_max_size(struct net_device *dev, | |||
| 2049 | dev->gso_max_size = size; | 2173 | dev->gso_max_size = size; |
| 2050 | } | 2174 | } |
| 2051 | 2175 | ||
| 2052 | static inline void skb_bond_set_mac_by_master(struct sk_buff *skb, | 2176 | extern int __skb_bond_should_drop(struct sk_buff *skb, |
| 2053 | struct net_device *master) | 2177 | struct net_device *master); |
| 2054 | { | ||
| 2055 | if (skb->pkt_type == PACKET_HOST) { | ||
| 2056 | u16 *dest = (u16 *) eth_hdr(skb)->h_dest; | ||
| 2057 | 2178 | ||
| 2058 | memcpy(dest, master->dev_addr, ETH_ALEN); | ||
| 2059 | } | ||
| 2060 | } | ||
| 2061 | |||
| 2062 | /* On bonding slaves other than the currently active slave, suppress | ||
| 2063 | * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and | ||
| 2064 | * ARP on active-backup slaves with arp_validate enabled. | ||
| 2065 | */ | ||
| 2066 | static inline int skb_bond_should_drop(struct sk_buff *skb, | 2179 | static inline int skb_bond_should_drop(struct sk_buff *skb, |
| 2067 | struct net_device *master) | 2180 | struct net_device *master) |
| 2068 | { | 2181 | { |
| 2069 | if (master) { | 2182 | if (master) |
| 2070 | struct net_device *dev = skb->dev; | 2183 | return __skb_bond_should_drop(skb, master); |
| 2071 | |||
| 2072 | if (master->priv_flags & IFF_MASTER_ARPMON) | ||
| 2073 | dev->last_rx = jiffies; | ||
| 2074 | |||
| 2075 | if ((master->priv_flags & IFF_MASTER_ALB) && master->br_port) { | ||
| 2076 | /* Do address unmangle. The local destination address | ||
| 2077 | * will be always the one master has. Provides the right | ||
| 2078 | * functionality in a bridge. | ||
| 2079 | */ | ||
| 2080 | skb_bond_set_mac_by_master(skb, master); | ||
| 2081 | } | ||
| 2082 | |||
| 2083 | if (dev->priv_flags & IFF_SLAVE_INACTIVE) { | ||
| 2084 | if ((dev->priv_flags & IFF_SLAVE_NEEDARP) && | ||
| 2085 | skb->protocol == __cpu_to_be16(ETH_P_ARP)) | ||
| 2086 | return 0; | ||
| 2087 | |||
| 2088 | if (master->priv_flags & IFF_MASTER_ALB) { | ||
| 2089 | if (skb->pkt_type != PACKET_BROADCAST && | ||
| 2090 | skb->pkt_type != PACKET_MULTICAST) | ||
| 2091 | return 0; | ||
| 2092 | } | ||
| 2093 | if (master->priv_flags & IFF_MASTER_8023AD && | ||
| 2094 | skb->protocol == __cpu_to_be16(ETH_P_SLOW)) | ||
| 2095 | return 0; | ||
| 2096 | |||
| 2097 | return 1; | ||
| 2098 | } | ||
| 2099 | } | ||
| 2100 | return 0; | 2184 | return 0; |
| 2101 | } | 2185 | } |
| 2102 | 2186 | ||
diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild index a5a63e41b8af..48767cd16453 100644 --- a/include/linux/netfilter/Kbuild +++ b/include/linux/netfilter/Kbuild | |||
| @@ -16,6 +16,7 @@ header-y += xt_RATEEST.h | |||
| 16 | header-y += xt_SECMARK.h | 16 | header-y += xt_SECMARK.h |
| 17 | header-y += xt_TCPMSS.h | 17 | header-y += xt_TCPMSS.h |
| 18 | header-y += xt_TCPOPTSTRIP.h | 18 | header-y += xt_TCPOPTSTRIP.h |
| 19 | header-y += xt_TEE.h | ||
| 19 | header-y += xt_TPROXY.h | 20 | header-y += xt_TPROXY.h |
| 20 | header-y += xt_comment.h | 21 | header-y += xt_comment.h |
| 21 | header-y += xt_connbytes.h | 22 | header-y += xt_connbytes.h |
diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index c608677dda60..14e6d32002c4 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h | |||
| @@ -113,6 +113,7 @@ struct ip_conntrack_stat { | |||
| 113 | unsigned int expect_new; | 113 | unsigned int expect_new; |
| 114 | unsigned int expect_create; | 114 | unsigned int expect_create; |
| 115 | unsigned int expect_delete; | 115 | unsigned int expect_delete; |
| 116 | unsigned int search_restart; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | /* call to create an explicit dependency on nf_conntrack. */ | 119 | /* call to create an explicit dependency on nf_conntrack. */ |
diff --git a/include/linux/netfilter/nf_conntrack_tuple_common.h b/include/linux/netfilter/nf_conntrack_tuple_common.h index 8e145f0d61cb..2ea22b018a87 100644 --- a/include/linux/netfilter/nf_conntrack_tuple_common.h +++ b/include/linux/netfilter/nf_conntrack_tuple_common.h | |||
| @@ -1,8 +1,7 @@ | |||
| 1 | #ifndef _NF_CONNTRACK_TUPLE_COMMON_H | 1 | #ifndef _NF_CONNTRACK_TUPLE_COMMON_H |
| 2 | #define _NF_CONNTRACK_TUPLE_COMMON_H | 2 | #define _NF_CONNTRACK_TUPLE_COMMON_H |
| 3 | 3 | ||
| 4 | enum ip_conntrack_dir | 4 | enum ip_conntrack_dir { |
| 5 | { | ||
| 6 | IP_CT_DIR_ORIGINAL, | 5 | IP_CT_DIR_ORIGINAL, |
| 7 | IP_CT_DIR_REPLY, | 6 | IP_CT_DIR_REPLY, |
| 8 | IP_CT_DIR_MAX | 7 | IP_CT_DIR_MAX |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 84c7c928e9eb..c2ee5d8550cf 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -1,9 +1,10 @@ | |||
| 1 | #ifndef _X_TABLES_H | 1 | #ifndef _X_TABLES_H |
| 2 | #define _X_TABLES_H | 2 | #define _X_TABLES_H |
| 3 | 3 | #include <linux/kernel.h> | |
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | #define XT_FUNCTION_MAXNAMELEN 30 | 6 | #define XT_FUNCTION_MAXNAMELEN 30 |
| 7 | #define XT_EXTENSION_MAXNAMELEN 29 | ||
| 7 | #define XT_TABLE_MAXNAMELEN 32 | 8 | #define XT_TABLE_MAXNAMELEN 32 |
| 8 | 9 | ||
| 9 | struct xt_entry_match { | 10 | struct xt_entry_match { |
| @@ -12,8 +13,7 @@ struct xt_entry_match { | |||
| 12 | __u16 match_size; | 13 | __u16 match_size; |
| 13 | 14 | ||
| 14 | /* Used by userspace */ | 15 | /* Used by userspace */ |
| 15 | char name[XT_FUNCTION_MAXNAMELEN-1]; | 16 | char name[XT_EXTENSION_MAXNAMELEN]; |
| 16 | |||
| 17 | __u8 revision; | 17 | __u8 revision; |
| 18 | } user; | 18 | } user; |
| 19 | struct { | 19 | struct { |
| @@ -36,8 +36,7 @@ struct xt_entry_target { | |||
| 36 | __u16 target_size; | 36 | __u16 target_size; |
| 37 | 37 | ||
| 38 | /* Used by userspace */ | 38 | /* Used by userspace */ |
| 39 | char name[XT_FUNCTION_MAXNAMELEN-1]; | 39 | char name[XT_EXTENSION_MAXNAMELEN]; |
| 40 | |||
| 41 | __u8 revision; | 40 | __u8 revision; |
| 42 | } user; | 41 | } user; |
| 43 | struct { | 42 | struct { |
| @@ -70,8 +69,7 @@ struct xt_standard_target { | |||
| 70 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision | 69 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision |
| 71 | * kernel supports, if >= revision. */ | 70 | * kernel supports, if >= revision. */ |
| 72 | struct xt_get_revision { | 71 | struct xt_get_revision { |
| 73 | char name[XT_FUNCTION_MAXNAMELEN-1]; | 72 | char name[XT_EXTENSION_MAXNAMELEN]; |
| 74 | |||
| 75 | __u8 revision; | 73 | __u8 revision; |
| 76 | }; | 74 | }; |
| 77 | 75 | ||
| @@ -93,7 +91,7 @@ struct _xt_align { | |||
| 93 | __u64 u64; | 91 | __u64 u64; |
| 94 | }; | 92 | }; |
| 95 | 93 | ||
| 96 | #define XT_ALIGN(s) ALIGN((s), __alignof__(struct _xt_align)) | 94 | #define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align)) |
| 97 | 95 | ||
| 98 | /* Standard return verdict, or do jump. */ | 96 | /* Standard return verdict, or do jump. */ |
| 99 | #define XT_STANDARD_TARGET "" | 97 | #define XT_STANDARD_TARGET "" |
| @@ -185,40 +183,53 @@ struct xt_counters_info { | |||
| 185 | #include <linux/netdevice.h> | 183 | #include <linux/netdevice.h> |
| 186 | 184 | ||
| 187 | /** | 185 | /** |
| 188 | * struct xt_match_param - parameters for match extensions' match functions | 186 | * struct xt_action_param - parameters for matches/targets |
| 189 | * | 187 | * |
| 188 | * @match: the match extension | ||
| 189 | * @target: the target extension | ||
| 190 | * @matchinfo: per-match data | ||
| 191 | * @targetinfo: per-target data | ||
| 190 | * @in: input netdevice | 192 | * @in: input netdevice |
| 191 | * @out: output netdevice | 193 | * @out: output netdevice |
| 192 | * @match: struct xt_match through which this function was invoked | ||
| 193 | * @matchinfo: per-match data | ||
| 194 | * @fragoff: packet is a fragment, this is the data offset | 194 | * @fragoff: packet is a fragment, this is the data offset |
| 195 | * @thoff: position of transport header relative to skb->data | 195 | * @thoff: position of transport header relative to skb->data |
| 196 | * @hook: hook number given packet came from | 196 | * @hook: hook number given packet came from |
| 197 | * @family: Actual NFPROTO_* through which the function is invoked | 197 | * @family: Actual NFPROTO_* through which the function is invoked |
| 198 | * (helpful when match->family == NFPROTO_UNSPEC) | 198 | * (helpful when match->family == NFPROTO_UNSPEC) |
| 199 | * | ||
| 200 | * Fields written to by extensions: | ||
| 201 | * | ||
| 199 | * @hotdrop: drop packet if we had inspection problems | 202 | * @hotdrop: drop packet if we had inspection problems |
| 203 | * Network namespace obtainable using dev_net(in/out) | ||
| 200 | */ | 204 | */ |
| 201 | struct xt_match_param { | 205 | struct xt_action_param { |
| 206 | union { | ||
| 207 | const struct xt_match *match; | ||
| 208 | const struct xt_target *target; | ||
| 209 | }; | ||
| 210 | union { | ||
| 211 | const void *matchinfo, *targinfo; | ||
| 212 | }; | ||
| 202 | const struct net_device *in, *out; | 213 | const struct net_device *in, *out; |
| 203 | const struct xt_match *match; | ||
| 204 | const void *matchinfo; | ||
| 205 | int fragoff; | 214 | int fragoff; |
| 206 | unsigned int thoff; | 215 | unsigned int thoff; |
| 207 | unsigned int hooknum; | 216 | unsigned int hooknum; |
| 208 | u_int8_t family; | 217 | u_int8_t family; |
| 209 | bool *hotdrop; | 218 | bool hotdrop; |
| 210 | }; | 219 | }; |
| 211 | 220 | ||
| 212 | /** | 221 | /** |
| 213 | * struct xt_mtchk_param - parameters for match extensions' | 222 | * struct xt_mtchk_param - parameters for match extensions' |
| 214 | * checkentry functions | 223 | * checkentry functions |
| 215 | * | 224 | * |
| 225 | * @net: network namespace through which the check was invoked | ||
| 216 | * @table: table the rule is tried to be inserted into | 226 | * @table: table the rule is tried to be inserted into |
| 217 | * @entryinfo: the family-specific rule data | 227 | * @entryinfo: the family-specific rule data |
| 218 | * (struct ipt_ip, ip6t_ip, ebt_entry) | 228 | * (struct ipt_ip, ip6t_ip, arpt_arp or (note) ebt_entry) |
| 219 | * @match: struct xt_match through which this function was invoked | 229 | * @match: struct xt_match through which this function was invoked |
| 220 | * @matchinfo: per-match data | 230 | * @matchinfo: per-match data |
| 221 | * @hook_mask: via which hooks the new rule is reachable | 231 | * @hook_mask: via which hooks the new rule is reachable |
| 232 | * Other fields as above. | ||
| 222 | */ | 233 | */ |
| 223 | struct xt_mtchk_param { | 234 | struct xt_mtchk_param { |
| 224 | struct net *net; | 235 | struct net *net; |
| @@ -230,7 +241,10 @@ struct xt_mtchk_param { | |||
| 230 | u_int8_t family; | 241 | u_int8_t family; |
| 231 | }; | 242 | }; |
| 232 | 243 | ||
| 233 | /* Match destructor parameters */ | 244 | /** |
| 245 | * struct xt_mdtor_param - match destructor parameters | ||
| 246 | * Fields as above. | ||
| 247 | */ | ||
| 234 | struct xt_mtdtor_param { | 248 | struct xt_mtdtor_param { |
| 235 | struct net *net; | 249 | struct net *net; |
| 236 | const struct xt_match *match; | 250 | const struct xt_match *match; |
| @@ -239,23 +253,6 @@ struct xt_mtdtor_param { | |||
| 239 | }; | 253 | }; |
| 240 | 254 | ||
| 241 | /** | 255 | /** |
| 242 | * struct xt_target_param - parameters for target extensions' target functions | ||
| 243 | * | ||
| 244 | * @hooknum: hook through which this target was invoked | ||
| 245 | * @target: struct xt_target through which this function was invoked | ||
| 246 | * @targinfo: per-target data | ||
| 247 | * | ||
| 248 | * Other fields see above. | ||
| 249 | */ | ||
| 250 | struct xt_target_param { | ||
| 251 | const struct net_device *in, *out; | ||
| 252 | const struct xt_target *target; | ||
| 253 | const void *targinfo; | ||
| 254 | unsigned int hooknum; | ||
| 255 | u_int8_t family; | ||
| 256 | }; | ||
| 257 | |||
| 258 | /** | ||
| 259 | * struct xt_tgchk_param - parameters for target extensions' | 256 | * struct xt_tgchk_param - parameters for target extensions' |
| 260 | * checkentry functions | 257 | * checkentry functions |
| 261 | * | 258 | * |
| @@ -285,7 +282,7 @@ struct xt_tgdtor_param { | |||
| 285 | struct xt_match { | 282 | struct xt_match { |
| 286 | struct list_head list; | 283 | struct list_head list; |
| 287 | 284 | ||
| 288 | const char name[XT_FUNCTION_MAXNAMELEN-1]; | 285 | const char name[XT_EXTENSION_MAXNAMELEN]; |
| 289 | u_int8_t revision; | 286 | u_int8_t revision; |
| 290 | 287 | ||
| 291 | /* Return true or false: return FALSE and set *hotdrop = 1 to | 288 | /* Return true or false: return FALSE and set *hotdrop = 1 to |
| @@ -294,10 +291,10 @@ struct xt_match { | |||
| 294 | non-linear skb, using skb_header_pointer and | 291 | non-linear skb, using skb_header_pointer and |
| 295 | skb_ip_make_writable. */ | 292 | skb_ip_make_writable. */ |
| 296 | bool (*match)(const struct sk_buff *skb, | 293 | bool (*match)(const struct sk_buff *skb, |
| 297 | const struct xt_match_param *); | 294 | struct xt_action_param *); |
| 298 | 295 | ||
| 299 | /* Called when user tries to insert an entry of this type. */ | 296 | /* Called when user tries to insert an entry of this type. */ |
| 300 | bool (*checkentry)(const struct xt_mtchk_param *); | 297 | int (*checkentry)(const struct xt_mtchk_param *); |
| 301 | 298 | ||
| 302 | /* Called when entry of this type deleted. */ | 299 | /* Called when entry of this type deleted. */ |
| 303 | void (*destroy)(const struct xt_mtdtor_param *); | 300 | void (*destroy)(const struct xt_mtdtor_param *); |
| @@ -309,9 +306,6 @@ struct xt_match { | |||
| 309 | /* Set this to THIS_MODULE if you are a module, otherwise NULL */ | 306 | /* Set this to THIS_MODULE if you are a module, otherwise NULL */ |
| 310 | struct module *me; | 307 | struct module *me; |
| 311 | 308 | ||
| 312 | /* Free to use by each match */ | ||
| 313 | unsigned long data; | ||
| 314 | |||
| 315 | const char *table; | 309 | const char *table; |
| 316 | unsigned int matchsize; | 310 | unsigned int matchsize; |
| 317 | #ifdef CONFIG_COMPAT | 311 | #ifdef CONFIG_COMPAT |
| @@ -327,19 +321,20 @@ struct xt_match { | |||
| 327 | struct xt_target { | 321 | struct xt_target { |
| 328 | struct list_head list; | 322 | struct list_head list; |
| 329 | 323 | ||
| 330 | const char name[XT_FUNCTION_MAXNAMELEN-1]; | 324 | const char name[XT_EXTENSION_MAXNAMELEN]; |
| 325 | u_int8_t revision; | ||
| 331 | 326 | ||
| 332 | /* Returns verdict. Argument order changed since 2.6.9, as this | 327 | /* Returns verdict. Argument order changed since 2.6.9, as this |
| 333 | must now handle non-linear skbs, using skb_copy_bits and | 328 | must now handle non-linear skbs, using skb_copy_bits and |
| 334 | skb_ip_make_writable. */ | 329 | skb_ip_make_writable. */ |
| 335 | unsigned int (*target)(struct sk_buff *skb, | 330 | unsigned int (*target)(struct sk_buff *skb, |
| 336 | const struct xt_target_param *); | 331 | const struct xt_action_param *); |
| 337 | 332 | ||
| 338 | /* Called when user tries to insert an entry of this type: | 333 | /* Called when user tries to insert an entry of this type: |
| 339 | hook_mask is a bitmask of hooks from which it can be | 334 | hook_mask is a bitmask of hooks from which it can be |
| 340 | called. */ | 335 | called. */ |
| 341 | /* Should return true or false. */ | 336 | /* Should return true or false, or an error code (-Exxxx). */ |
| 342 | bool (*checkentry)(const struct xt_tgchk_param *); | 337 | int (*checkentry)(const struct xt_tgchk_param *); |
| 343 | 338 | ||
| 344 | /* Called when entry of this type deleted. */ | 339 | /* Called when entry of this type deleted. */ |
| 345 | void (*destroy)(const struct xt_tgdtor_param *); | 340 | void (*destroy)(const struct xt_tgdtor_param *); |
| @@ -360,7 +355,6 @@ struct xt_target { | |||
| 360 | unsigned short proto; | 355 | unsigned short proto; |
| 361 | 356 | ||
| 362 | unsigned short family; | 357 | unsigned short family; |
| 363 | u_int8_t revision; | ||
| 364 | }; | 358 | }; |
| 365 | 359 | ||
| 366 | /* Furniture shopping... */ | 360 | /* Furniture shopping... */ |
| @@ -398,6 +392,13 @@ struct xt_table_info { | |||
| 398 | unsigned int hook_entry[NF_INET_NUMHOOKS]; | 392 | unsigned int hook_entry[NF_INET_NUMHOOKS]; |
| 399 | unsigned int underflow[NF_INET_NUMHOOKS]; | 393 | unsigned int underflow[NF_INET_NUMHOOKS]; |
| 400 | 394 | ||
| 395 | /* | ||
| 396 | * Number of user chains. Since tables cannot have loops, at most | ||
| 397 | * @stacksize jumps (number of user chains) can possibly be made. | ||
| 398 | */ | ||
| 399 | unsigned int stacksize; | ||
| 400 | unsigned int *stackptr; | ||
| 401 | void ***jumpstack; | ||
| 401 | /* ipt_entry tables: one per CPU */ | 402 | /* ipt_entry tables: one per CPU */ |
| 402 | /* Note : this field MUST be the last one, see XT_TABLE_INFO_SZ */ | 403 | /* Note : this field MUST be the last one, see XT_TABLE_INFO_SZ */ |
| 403 | void *entries[1]; | 404 | void *entries[1]; |
| @@ -433,6 +434,8 @@ extern struct xt_table_info *xt_replace_table(struct xt_table *table, | |||
| 433 | 434 | ||
| 434 | extern struct xt_match *xt_find_match(u8 af, const char *name, u8 revision); | 435 | extern struct xt_match *xt_find_match(u8 af, const char *name, u8 revision); |
| 435 | extern struct xt_target *xt_find_target(u8 af, const char *name, u8 revision); | 436 | extern struct xt_target *xt_find_target(u8 af, const char *name, u8 revision); |
| 437 | extern struct xt_match *xt_request_find_match(u8 af, const char *name, | ||
| 438 | u8 revision); | ||
| 436 | extern struct xt_target *xt_request_find_target(u8 af, const char *name, | 439 | extern struct xt_target *xt_request_find_target(u8 af, const char *name, |
| 437 | u8 revision); | 440 | u8 revision); |
| 438 | extern int xt_find_revision(u8 af, const char *name, u8 revision, | 441 | extern int xt_find_revision(u8 af, const char *name, u8 revision, |
| @@ -598,7 +601,7 @@ struct _compat_xt_align { | |||
| 598 | compat_u64 u64; | 601 | compat_u64 u64; |
| 599 | }; | 602 | }; |
| 600 | 603 | ||
| 601 | #define COMPAT_XT_ALIGN(s) ALIGN((s), __alignof__(struct _compat_xt_align)) | 604 | #define COMPAT_XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _compat_xt_align)) |
| 602 | 605 | ||
| 603 | extern void xt_compat_lock(u_int8_t af); | 606 | extern void xt_compat_lock(u_int8_t af); |
| 604 | extern void xt_compat_unlock(u_int8_t af); | 607 | extern void xt_compat_unlock(u_int8_t af); |
diff --git a/include/linux/netfilter/xt_CONNMARK.h b/include/linux/netfilter/xt_CONNMARK.h index 0a8545866752..2f2e48ec8023 100644 --- a/include/linux/netfilter/xt_CONNMARK.h +++ b/include/linux/netfilter/xt_CONNMARK.h | |||
| @@ -1,26 +1,6 @@ | |||
| 1 | #ifndef _XT_CONNMARK_H_target | 1 | #ifndef _XT_CONNMARK_H_target |
| 2 | #define _XT_CONNMARK_H_target | 2 | #define _XT_CONNMARK_H_target |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/netfilter/xt_connmark.h> |
| 5 | |||
| 6 | /* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com> | ||
| 7 | * by Henrik Nordstrom <hno@marasystems.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | */ | ||
| 14 | |||
| 15 | enum { | ||
| 16 | XT_CONNMARK_SET = 0, | ||
| 17 | XT_CONNMARK_SAVE, | ||
| 18 | XT_CONNMARK_RESTORE | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct xt_connmark_tginfo1 { | ||
| 22 | __u32 ctmark, ctmask, nfmask; | ||
| 23 | __u8 mode; | ||
| 24 | }; | ||
| 25 | 5 | ||
| 26 | #endif /*_XT_CONNMARK_H_target*/ | 6 | #endif /*_XT_CONNMARK_H_target*/ |
diff --git a/include/linux/netfilter/xt_MARK.h b/include/linux/netfilter/xt_MARK.h index bc9561bdef79..41c456deba22 100644 --- a/include/linux/netfilter/xt_MARK.h +++ b/include/linux/netfilter/xt_MARK.h | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | #ifndef _XT_MARK_H_target | 1 | #ifndef _XT_MARK_H_target |
| 2 | #define _XT_MARK_H_target | 2 | #define _XT_MARK_H_target |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/netfilter/xt_mark.h> |
| 5 | |||
| 6 | struct xt_mark_tginfo2 { | ||
| 7 | __u32 mark, mask; | ||
| 8 | }; | ||
| 9 | 5 | ||
| 10 | #endif /*_XT_MARK_H_target */ | 6 | #endif /*_XT_MARK_H_target */ |
diff --git a/include/linux/netfilter/xt_TEE.h b/include/linux/netfilter/xt_TEE.h new file mode 100644 index 000000000000..5c21d5c829af --- /dev/null +++ b/include/linux/netfilter/xt_TEE.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | #ifndef _XT_TEE_TARGET_H | ||
| 2 | #define _XT_TEE_TARGET_H | ||
| 3 | |||
| 4 | struct xt_tee_tginfo { | ||
| 5 | union nf_inet_addr gw; | ||
| 6 | char oif[16]; | ||
| 7 | |||
| 8 | /* used internally by the kernel */ | ||
| 9 | struct xt_tee_priv *priv __attribute__((aligned(8))); | ||
| 10 | }; | ||
| 11 | |||
| 12 | #endif /* _XT_TEE_TARGET_H */ | ||
diff --git a/include/linux/netfilter/xt_connmark.h b/include/linux/netfilter/xt_connmark.h index 619e47cde01a..efc17a8305fb 100644 --- a/include/linux/netfilter/xt_connmark.h +++ b/include/linux/netfilter/xt_connmark.h | |||
| @@ -12,6 +12,17 @@ | |||
| 12 | * (at your option) any later version. | 12 | * (at your option) any later version. |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | enum { | ||
| 16 | XT_CONNMARK_SET = 0, | ||
| 17 | XT_CONNMARK_SAVE, | ||
| 18 | XT_CONNMARK_RESTORE | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct xt_connmark_tginfo1 { | ||
| 22 | __u32 ctmark, ctmask, nfmask; | ||
| 23 | __u8 mode; | ||
| 24 | }; | ||
| 25 | |||
| 15 | struct xt_connmark_mtinfo1 { | 26 | struct xt_connmark_mtinfo1 { |
| 16 | __u32 mark, mask; | 27 | __u32 mark, mask; |
| 17 | __u8 invert; | 28 | __u8 invert; |
diff --git a/include/linux/netfilter/xt_mark.h b/include/linux/netfilter/xt_mark.h index 6607c8f38ea5..ecadc40d5cde 100644 --- a/include/linux/netfilter/xt_mark.h +++ b/include/linux/netfilter/xt_mark.h | |||
| @@ -3,6 +3,10 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | struct xt_mark_tginfo2 { | ||
| 7 | __u32 mark, mask; | ||
| 8 | }; | ||
| 9 | |||
| 6 | struct xt_mark_mtinfo1 { | 10 | struct xt_mark_mtinfo1 { |
| 7 | __u32 mark, mask; | 11 | __u32 mark, mask; |
| 8 | __u8 invert; | 12 | __u8 invert; |
diff --git a/include/linux/netfilter/xt_recent.h b/include/linux/netfilter/xt_recent.h index d2c276609925..83318e01425e 100644 --- a/include/linux/netfilter/xt_recent.h +++ b/include/linux/netfilter/xt_recent.h | |||
| @@ -9,6 +9,7 @@ enum { | |||
| 9 | XT_RECENT_UPDATE = 1 << 2, | 9 | XT_RECENT_UPDATE = 1 << 2, |
| 10 | XT_RECENT_REMOVE = 1 << 3, | 10 | XT_RECENT_REMOVE = 1 << 3, |
| 11 | XT_RECENT_TTL = 1 << 4, | 11 | XT_RECENT_TTL = 1 << 4, |
| 12 | XT_RECENT_REAP = 1 << 5, | ||
| 12 | 13 | ||
| 13 | XT_RECENT_SOURCE = 0, | 14 | XT_RECENT_SOURCE = 0, |
| 14 | XT_RECENT_DEST = 1, | 15 | XT_RECENT_DEST = 1, |
| @@ -16,6 +17,12 @@ enum { | |||
| 16 | XT_RECENT_NAME_LEN = 200, | 17 | XT_RECENT_NAME_LEN = 200, |
| 17 | }; | 18 | }; |
| 18 | 19 | ||
| 20 | /* Only allowed with --rcheck and --update */ | ||
| 21 | #define XT_RECENT_MODIFIERS (XT_RECENT_TTL|XT_RECENT_REAP) | ||
| 22 | |||
| 23 | #define XT_RECENT_VALID_FLAGS (XT_RECENT_CHECK|XT_RECENT_SET|XT_RECENT_UPDATE|\ | ||
| 24 | XT_RECENT_REMOVE|XT_RECENT_TTL|XT_RECENT_REAP) | ||
| 25 | |||
| 19 | struct xt_recent_mtinfo { | 26 | struct xt_recent_mtinfo { |
| 20 | __u32 seconds; | 27 | __u32 seconds; |
| 21 | __u32 hit_count; | 28 | __u32 hit_count; |
diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index f8105e54716a..0ddd161f3b06 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h | |||
| @@ -41,10 +41,10 @@ enum nf_br_hook_priorities { | |||
| 41 | 41 | ||
| 42 | #define BRNF_PKT_TYPE 0x01 | 42 | #define BRNF_PKT_TYPE 0x01 |
| 43 | #define BRNF_BRIDGED_DNAT 0x02 | 43 | #define BRNF_BRIDGED_DNAT 0x02 |
| 44 | #define BRNF_DONT_TAKE_PARENT 0x04 | 44 | #define BRNF_BRIDGED 0x04 |
| 45 | #define BRNF_BRIDGED 0x08 | 45 | #define BRNF_NF_BRIDGE_PREROUTING 0x08 |
| 46 | #define BRNF_NF_BRIDGE_PREROUTING 0x10 | 46 | #define BRNF_8021Q 0x10 |
| 47 | 47 | #define BRNF_PPPoE 0x20 | |
| 48 | 48 | ||
| 49 | /* Only used in br_forward.c */ | 49 | /* Only used in br_forward.c */ |
| 50 | extern int nf_bridge_copy_header(struct sk_buff *skb); | 50 | extern int nf_bridge_copy_header(struct sk_buff *skb); |
| @@ -68,6 +68,27 @@ static inline unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb) | |||
| 68 | } | 68 | } |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | ||
| 72 | { | ||
| 73 | if (unlikely(skb->nf_bridge->mask & BRNF_PPPoE)) | ||
| 74 | return PPPOE_SES_HLEN; | ||
| 75 | return 0; | ||
| 76 | } | ||
| 77 | |||
| 78 | extern int br_handle_frame_finish(struct sk_buff *skb); | ||
| 79 | /* Only used in br_device.c */ | ||
| 80 | static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb) | ||
| 81 | { | ||
| 82 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | ||
| 83 | |||
| 84 | skb_pull(skb, ETH_HLEN); | ||
| 85 | nf_bridge->mask ^= BRNF_BRIDGED_DNAT; | ||
| 86 | skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN), | ||
| 87 | skb->nf_bridge->data, ETH_HLEN-ETH_ALEN); | ||
| 88 | skb->dev = nf_bridge->physindev; | ||
| 89 | return br_handle_frame_finish(skb); | ||
| 90 | } | ||
| 91 | |||
| 71 | /* This is called by the IP fragmenting code and it ensures there is | 92 | /* This is called by the IP fragmenting code and it ensures there is |
| 72 | * enough room for the encapsulating header (if there is one). */ | 93 | * enough room for the encapsulating header (if there is one). */ |
| 73 | static inline unsigned int nf_bridge_pad(const struct sk_buff *skb) | 94 | static inline unsigned int nf_bridge_pad(const struct sk_buff *skb) |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index e5ba03d783c6..18442ff19c07 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
| @@ -316,10 +316,6 @@ extern int ip6t_ext_hdr(u8 nexthdr); | |||
| 316 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | 316 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, |
| 317 | int target, unsigned short *fragoff); | 317 | int target, unsigned short *fragoff); |
| 318 | 318 | ||
| 319 | extern int ip6_masked_addrcmp(const struct in6_addr *addr1, | ||
| 320 | const struct in6_addr *mask, | ||
| 321 | const struct in6_addr *addr2); | ||
| 322 | |||
| 323 | #define IP6T_ALIGN(s) XT_ALIGN(s) | 319 | #define IP6T_ALIGN(s) XT_ALIGN(s) |
| 324 | 320 | ||
| 325 | #ifdef CONFIG_COMPAT | 321 | #ifdef CONFIG_COMPAT |
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index a765ea898549..e9e231215865 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | struct netpoll { | 15 | struct netpoll { |
| 16 | struct net_device *dev; | 16 | struct net_device *dev; |
| 17 | struct net_device *real_dev; | ||
| 17 | char dev_name[IFNAMSIZ]; | 18 | char dev_name[IFNAMSIZ]; |
| 18 | const char *name; | 19 | const char *name; |
| 19 | void (*rx_hook)(struct netpoll *, int, char *, int); | 20 | void (*rx_hook)(struct netpoll *, int, char *, int); |
| @@ -36,8 +37,11 @@ struct netpoll_info { | |||
| 36 | struct sk_buff_head txq; | 37 | struct sk_buff_head txq; |
| 37 | 38 | ||
| 38 | struct delayed_work tx_work; | 39 | struct delayed_work tx_work; |
| 40 | |||
| 41 | struct netpoll *netpoll; | ||
| 39 | }; | 42 | }; |
| 40 | 43 | ||
| 44 | void netpoll_poll_dev(struct net_device *dev); | ||
| 41 | void netpoll_poll(struct netpoll *np); | 45 | void netpoll_poll(struct netpoll *np); |
| 42 | void netpoll_send_udp(struct netpoll *np, const char *msg, int len); | 46 | void netpoll_send_udp(struct netpoll *np, const char *msg, int len); |
| 43 | void netpoll_print_options(struct netpoll *np); | 47 | void netpoll_print_options(struct netpoll *np); |
| @@ -47,22 +51,23 @@ int netpoll_trap(void); | |||
| 47 | void netpoll_set_trap(int trap); | 51 | void netpoll_set_trap(int trap); |
| 48 | void netpoll_cleanup(struct netpoll *np); | 52 | void netpoll_cleanup(struct netpoll *np); |
| 49 | int __netpoll_rx(struct sk_buff *skb); | 53 | int __netpoll_rx(struct sk_buff *skb); |
| 54 | void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb); | ||
| 50 | 55 | ||
| 51 | 56 | ||
| 52 | #ifdef CONFIG_NETPOLL | 57 | #ifdef CONFIG_NETPOLL |
| 53 | static inline int netpoll_rx(struct sk_buff *skb) | 58 | static inline bool netpoll_rx(struct sk_buff *skb) |
| 54 | { | 59 | { |
| 55 | struct netpoll_info *npinfo = skb->dev->npinfo; | 60 | struct netpoll_info *npinfo = skb->dev->npinfo; |
| 56 | unsigned long flags; | 61 | unsigned long flags; |
| 57 | int ret = 0; | 62 | bool ret = false; |
| 58 | 63 | ||
| 59 | if (!npinfo || (list_empty(&npinfo->rx_np) && !npinfo->rx_flags)) | 64 | if (!npinfo || (list_empty(&npinfo->rx_np) && !npinfo->rx_flags)) |
| 60 | return 0; | 65 | return false; |
| 61 | 66 | ||
| 62 | spin_lock_irqsave(&npinfo->rx_lock, flags); | 67 | spin_lock_irqsave(&npinfo->rx_lock, flags); |
| 63 | /* check rx_flags again with the lock held */ | 68 | /* check rx_flags again with the lock held */ |
| 64 | if (npinfo->rx_flags && __netpoll_rx(skb)) | 69 | if (npinfo->rx_flags && __netpoll_rx(skb)) |
| 65 | ret = 1; | 70 | ret = true; |
| 66 | spin_unlock_irqrestore(&npinfo->rx_lock, flags); | 71 | spin_unlock_irqrestore(&npinfo->rx_lock, flags); |
| 67 | 72 | ||
| 68 | return ret; | 73 | return ret; |
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 28ba20fda3e2..b7c77f9712f4 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
| @@ -52,6 +52,8 @@ | |||
| 52 | * %NL80211_ATTR_WIPHY_CHANNEL_TYPE, %NL80211_ATTR_WIPHY_RETRY_SHORT, | 52 | * %NL80211_ATTR_WIPHY_CHANNEL_TYPE, %NL80211_ATTR_WIPHY_RETRY_SHORT, |
| 53 | * %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, | 53 | * %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, |
| 54 | * and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. | 54 | * and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. |
| 55 | * However, for setting the channel, see %NL80211_CMD_SET_CHANNEL | ||
| 56 | * instead, the support here is for backward compatibility only. | ||
| 55 | * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request | 57 | * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request |
| 56 | * or rename notification. Has attributes %NL80211_ATTR_WIPHY and | 58 | * or rename notification. Has attributes %NL80211_ATTR_WIPHY and |
| 57 | * %NL80211_ATTR_WIPHY_NAME. | 59 | * %NL80211_ATTR_WIPHY_NAME. |
| @@ -323,6 +325,21 @@ | |||
| 323 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the | 325 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the |
| 324 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged | 326 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged |
| 325 | * the frame. | 327 | * the frame. |
| 328 | * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command | ||
| 329 | * is used to configure connection quality monitoring notification trigger | ||
| 330 | * levels. | ||
| 331 | * @NL80211_CMD_NOTIFY_CQM: Connection quality monitor notification. This | ||
| 332 | * command is used as an event to indicate the that a trigger level was | ||
| 333 | * reached. | ||
| 334 | * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ | ||
| 335 | * and %NL80211_ATTR_WIPHY_CHANNEL_TYPE) the given interface (identifed | ||
| 336 | * by %NL80211_ATTR_IFINDEX) shall operate on. | ||
| 337 | * In case multiple channels are supported by the device, the mechanism | ||
| 338 | * with which it switches channels is implementation-defined. | ||
| 339 | * When a monitor interface is given, it can only switch channel while | ||
| 340 | * no other interfaces are operating to avoid disturbing the operation | ||
| 341 | * of any other interfaces, and other interfaces will again take | ||
| 342 | * precedence when they are used. | ||
| 326 | * | 343 | * |
| 327 | * @NL80211_CMD_MAX: highest used command number | 344 | * @NL80211_CMD_MAX: highest used command number |
| 328 | * @__NL80211_CMD_AFTER_LAST: internal use | 345 | * @__NL80211_CMD_AFTER_LAST: internal use |
| @@ -419,6 +436,11 @@ enum nl80211_commands { | |||
| 419 | NL80211_CMD_SET_POWER_SAVE, | 436 | NL80211_CMD_SET_POWER_SAVE, |
| 420 | NL80211_CMD_GET_POWER_SAVE, | 437 | NL80211_CMD_GET_POWER_SAVE, |
| 421 | 438 | ||
| 439 | NL80211_CMD_SET_CQM, | ||
| 440 | NL80211_CMD_NOTIFY_CQM, | ||
| 441 | |||
| 442 | NL80211_CMD_SET_CHANNEL, | ||
| 443 | |||
| 422 | /* add new commands above here */ | 444 | /* add new commands above here */ |
| 423 | 445 | ||
| 424 | /* used to define NL80211_CMD_MAX below */ | 446 | /* used to define NL80211_CMD_MAX below */ |
| @@ -691,6 +713,18 @@ enum nl80211_commands { | |||
| 691 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was | 713 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was |
| 692 | * acknowledged by the recipient. | 714 | * acknowledged by the recipient. |
| 693 | * | 715 | * |
| 716 | * @NL80211_ATTR_CQM: connection quality monitor configuration in a | ||
| 717 | * nested attribute with %NL80211_ATTR_CQM_* sub-attributes. | ||
| 718 | * | ||
| 719 | * @NL80211_ATTR_LOCAL_STATE_CHANGE: Flag attribute to indicate that a command | ||
| 720 | * is requesting a local authentication/association state change without | ||
| 721 | * invoking actual management frame exchange. This can be used with | ||
| 722 | * NL80211_CMD_AUTHENTICATE, NL80211_CMD_DEAUTHENTICATE, | ||
| 723 | * NL80211_CMD_DISASSOCIATE. | ||
| 724 | * | ||
| 725 | * @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations | ||
| 726 | * connected to this BSS. | ||
| 727 | * | ||
| 694 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 728 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| 695 | * @__NL80211_ATTR_AFTER_LAST: internal use | 729 | * @__NL80211_ATTR_AFTER_LAST: internal use |
| 696 | */ | 730 | */ |
| @@ -842,6 +876,12 @@ enum nl80211_attrs { | |||
| 842 | 876 | ||
| 843 | NL80211_ATTR_PS_STATE, | 877 | NL80211_ATTR_PS_STATE, |
| 844 | 878 | ||
| 879 | NL80211_ATTR_CQM, | ||
| 880 | |||
| 881 | NL80211_ATTR_LOCAL_STATE_CHANGE, | ||
| 882 | |||
| 883 | NL80211_ATTR_AP_ISOLATE, | ||
| 884 | |||
| 845 | /* add attributes here, update the policy in nl80211.c */ | 885 | /* add attributes here, update the policy in nl80211.c */ |
| 846 | 886 | ||
| 847 | __NL80211_ATTR_AFTER_LAST, | 887 | __NL80211_ATTR_AFTER_LAST, |
| @@ -1583,4 +1623,40 @@ enum nl80211_ps_state { | |||
| 1583 | NL80211_PS_ENABLED, | 1623 | NL80211_PS_ENABLED, |
| 1584 | }; | 1624 | }; |
| 1585 | 1625 | ||
| 1626 | /** | ||
| 1627 | * enum nl80211_attr_cqm - connection quality monitor attributes | ||
| 1628 | * @__NL80211_ATTR_CQM_INVALID: invalid | ||
| 1629 | * @NL80211_ATTR_CQM_RSSI_THOLD: RSSI threshold in dBm. This value specifies | ||
| 1630 | * the threshold for the RSSI level at which an event will be sent. Zero | ||
| 1631 | * to disable. | ||
| 1632 | * @NL80211_ATTR_CQM_RSSI_HYST: RSSI hysteresis in dBm. This value specifies | ||
| 1633 | * the minimum amount the RSSI level must change after an event before a | ||
| 1634 | * new event may be issued (to reduce effects of RSSI oscillation). | ||
| 1635 | * @NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT: RSSI threshold event | ||
| 1636 | * @__NL80211_ATTR_CQM_AFTER_LAST: internal | ||
| 1637 | * @NL80211_ATTR_CQM_MAX: highest key attribute | ||
| 1638 | */ | ||
| 1639 | enum nl80211_attr_cqm { | ||
| 1640 | __NL80211_ATTR_CQM_INVALID, | ||
| 1641 | NL80211_ATTR_CQM_RSSI_THOLD, | ||
| 1642 | NL80211_ATTR_CQM_RSSI_HYST, | ||
| 1643 | NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, | ||
| 1644 | |||
| 1645 | /* keep last */ | ||
| 1646 | __NL80211_ATTR_CQM_AFTER_LAST, | ||
| 1647 | NL80211_ATTR_CQM_MAX = __NL80211_ATTR_CQM_AFTER_LAST - 1 | ||
| 1648 | }; | ||
| 1649 | |||
| 1650 | /** | ||
| 1651 | * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event | ||
| 1652 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the | ||
| 1653 | * configured threshold | ||
| 1654 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the | ||
| 1655 | * configured threshold | ||
| 1656 | */ | ||
| 1657 | enum nl80211_cqm_rssi_threshold_event { | ||
| 1658 | NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW, | ||
| 1659 | NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH, | ||
| 1660 | }; | ||
| 1661 | |||
| 1586 | #endif /* __LINUX_NL80211_H */ | 1662 | #endif /* __LINUX_NL80211_H */ |
diff --git a/include/linux/notifier.h b/include/linux/notifier.h index fee6c2f68075..7c3609622334 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h | |||
| @@ -182,7 +182,10 @@ static inline int notifier_to_errno(int ret) | |||
| 182 | * VC switch chains (for loadable kernel svgalib VC switch helpers) etc... | 182 | * VC switch chains (for loadable kernel svgalib VC switch helpers) etc... |
| 183 | */ | 183 | */ |
| 184 | 184 | ||
| 185 | /* netdevice notifier chain */ | 185 | /* netdevice notifier chain. Please remember to update the rtnetlink |
| 186 | * notification exclusion list in rtnetlink_event() when adding new | ||
| 187 | * types. | ||
| 188 | */ | ||
| 186 | #define NETDEV_UP 0x0001 /* For now you can't veto a device up/down */ | 189 | #define NETDEV_UP 0x0001 /* For now you can't veto a device up/down */ |
| 187 | #define NETDEV_DOWN 0x0002 | 190 | #define NETDEV_DOWN 0x0002 |
| 188 | #define NETDEV_REBOOT 0x0003 /* Tell a protocol stack a network interface | 191 | #define NETDEV_REBOOT 0x0003 /* Tell a protocol stack a network interface |
| @@ -199,10 +202,11 @@ static inline int notifier_to_errno(int ret) | |||
| 199 | #define NETDEV_FEAT_CHANGE 0x000B | 202 | #define NETDEV_FEAT_CHANGE 0x000B |
| 200 | #define NETDEV_BONDING_FAILOVER 0x000C | 203 | #define NETDEV_BONDING_FAILOVER 0x000C |
| 201 | #define NETDEV_PRE_UP 0x000D | 204 | #define NETDEV_PRE_UP 0x000D |
| 202 | #define NETDEV_BONDING_OLDTYPE 0x000E | 205 | #define NETDEV_PRE_TYPE_CHANGE 0x000E |
| 203 | #define NETDEV_BONDING_NEWTYPE 0x000F | 206 | #define NETDEV_POST_TYPE_CHANGE 0x000F |
| 204 | #define NETDEV_POST_INIT 0x0010 | 207 | #define NETDEV_POST_INIT 0x0010 |
| 205 | #define NETDEV_UNREGISTER_BATCH 0x0011 | 208 | #define NETDEV_UNREGISTER_BATCH 0x0011 |
| 209 | #define NETDEV_BONDING_DESLAVE 0x0012 | ||
| 206 | 210 | ||
| 207 | #define SYS_DOWN 0x0001 /* Notify of system down */ | 211 | #define SYS_DOWN 0x0001 /* Notify of system down */ |
| 208 | #define SYS_RESTART SYS_DOWN | 212 | #define SYS_RESTART SYS_DOWN |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index c8f302991b66..c4c3d68be19a 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
| @@ -442,7 +442,10 @@ | |||
| 442 | #define PCI_EXP_LNKCTL_LABIE 0x0800 /* Lnk Autonomous Bandwidth Interrupt Enable */ | 442 | #define PCI_EXP_LNKCTL_LABIE 0x0800 /* Lnk Autonomous Bandwidth Interrupt Enable */ |
| 443 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | 443 | #define PCI_EXP_LNKSTA 18 /* Link Status */ |
| 444 | #define PCI_EXP_LNKSTA_CLS 0x000f /* Current Link Speed */ | 444 | #define PCI_EXP_LNKSTA_CLS 0x000f /* Current Link Speed */ |
| 445 | #define PCI_EXP_LNKSTA_CLS_2_5GB 0x01 /* Current Link Speed 2.5GT/s */ | ||
| 446 | #define PCI_EXP_LNKSTA_CLS_5_0GB 0x02 /* Current Link Speed 5.0GT/s */ | ||
| 445 | #define PCI_EXP_LNKSTA_NLW 0x03f0 /* Nogotiated Link Width */ | 447 | #define PCI_EXP_LNKSTA_NLW 0x03f0 /* Nogotiated Link Width */ |
| 448 | #define PCI_EXP_LNKSTA_NLW_SHIFT 4 /* start of NLW mask in link status */ | ||
| 446 | #define PCI_EXP_LNKSTA_LT 0x0800 /* Link Training */ | 449 | #define PCI_EXP_LNKSTA_LT 0x0800 /* Link Training */ |
| 447 | #define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */ | 450 | #define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */ |
| 448 | #define PCI_EXP_LNKSTA_DLLLA 0x2000 /* Data Link Layer Link Active */ | 451 | #define PCI_EXP_LNKSTA_DLLLA 0x2000 /* Data Link Layer Link Active */ |
diff --git a/include/linux/phy.h b/include/linux/phy.h index 14d7fdf6a90a..987e111f7b11 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/mii.h> | 24 | #include <linux/mii.h> |
| 25 | #include <linux/timer.h> | 25 | #include <linux/timer.h> |
| 26 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
| 27 | #include <linux/mod_devicetable.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/atomic.h> | 29 | #include <asm/atomic.h> |
| 29 | 30 | ||
| @@ -81,6 +82,10 @@ typedef enum { | |||
| 81 | */ | 82 | */ |
| 82 | #define MII_BUS_ID_SIZE (20 - 3) | 83 | #define MII_BUS_ID_SIZE (20 - 3) |
| 83 | 84 | ||
| 85 | /* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit | ||
| 86 | IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */ | ||
| 87 | #define MII_ADDR_C45 (1<<30) | ||
| 88 | |||
| 84 | /* | 89 | /* |
| 85 | * The Bus class for PHYs. Devices which provide access to | 90 | * The Bus class for PHYs. Devices which provide access to |
| 86 | * PHYs should register using this structure | 91 | * PHYs should register using this structure |
| @@ -127,8 +132,8 @@ int mdiobus_register(struct mii_bus *bus); | |||
| 127 | void mdiobus_unregister(struct mii_bus *bus); | 132 | void mdiobus_unregister(struct mii_bus *bus); |
| 128 | void mdiobus_free(struct mii_bus *bus); | 133 | void mdiobus_free(struct mii_bus *bus); |
| 129 | struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); | 134 | struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); |
| 130 | int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum); | 135 | int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); |
| 131 | int mdiobus_write(struct mii_bus *bus, int addr, u16 regnum, u16 val); | 136 | int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val); |
| 132 | 137 | ||
| 133 | 138 | ||
| 134 | #define PHY_INTERRUPT_DISABLED 0x0 | 139 | #define PHY_INTERRUPT_DISABLED 0x0 |
| @@ -422,7 +427,7 @@ struct phy_fixup { | |||
| 422 | * because the bus read/write functions may wait for an interrupt | 427 | * because the bus read/write functions may wait for an interrupt |
| 423 | * to conclude the operation. | 428 | * to conclude the operation. |
| 424 | */ | 429 | */ |
| 425 | static inline int phy_read(struct phy_device *phydev, u16 regnum) | 430 | static inline int phy_read(struct phy_device *phydev, u32 regnum) |
| 426 | { | 431 | { |
| 427 | return mdiobus_read(phydev->bus, phydev->addr, regnum); | 432 | return mdiobus_read(phydev->bus, phydev->addr, regnum); |
| 428 | } | 433 | } |
| @@ -437,7 +442,7 @@ static inline int phy_read(struct phy_device *phydev, u16 regnum) | |||
| 437 | * because the bus read/write functions may wait for an interrupt | 442 | * because the bus read/write functions may wait for an interrupt |
| 438 | * to conclude the operation. | 443 | * to conclude the operation. |
| 439 | */ | 444 | */ |
| 440 | static inline int phy_write(struct phy_device *phydev, u16 regnum, u16 val) | 445 | static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) |
| 441 | { | 446 | { |
| 442 | return mdiobus_write(phydev->bus, phydev->addr, regnum, val); | 447 | return mdiobus_write(phydev->bus, phydev->addr, regnum, val); |
| 443 | } | 448 | } |
diff --git a/include/linux/ppp_channel.h b/include/linux/ppp_channel.h index 0d3fa63e90ea..bff98ec1bfed 100644 --- a/include/linux/ppp_channel.h +++ b/include/linux/ppp_channel.h | |||
| @@ -72,6 +72,9 @@ extern int ppp_channel_index(struct ppp_channel *); | |||
| 72 | /* Get the unit number associated with a channel, or -1 if none */ | 72 | /* Get the unit number associated with a channel, or -1 if none */ |
| 73 | extern int ppp_unit_number(struct ppp_channel *); | 73 | extern int ppp_unit_number(struct ppp_channel *); |
| 74 | 74 | ||
| 75 | /* Get the device name associated with a channel, or NULL if none */ | ||
| 76 | extern char *ppp_dev_name(struct ppp_channel *); | ||
| 77 | |||
| 75 | /* | 78 | /* |
| 76 | * SMP locking notes: | 79 | * SMP locking notes: |
| 77 | * The channel code must ensure that when it calls ppp_unregister_channel, | 80 | * The channel code must ensure that when it calls ppp_unregister_channel, |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 2c9b46cff3d7..4ec3b38ce9c5 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
| @@ -428,5 +428,47 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
| 428 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | 428 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ |
| 429 | pos = rcu_dereference_raw(pos->next)) | 429 | pos = rcu_dereference_raw(pos->next)) |
| 430 | 430 | ||
| 431 | /** | ||
| 432 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type | ||
| 433 | * @tpos: the type * to use as a loop cursor. | ||
| 434 | * @pos: the &struct hlist_node to use as a loop cursor. | ||
| 435 | * @head: the head for your list. | ||
| 436 | * @member: the name of the hlist_node within the struct. | ||
| 437 | * | ||
| 438 | * This list-traversal primitive may safely run concurrently with | ||
| 439 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() | ||
| 440 | * as long as the traversal is guarded by rcu_read_lock(). | ||
| 441 | */ | ||
| 442 | #define hlist_for_each_entry_rcu_bh(tpos, pos, head, member) \ | ||
| 443 | for (pos = rcu_dereference_bh((head)->first); \ | ||
| 444 | pos && ({ prefetch(pos->next); 1; }) && \ | ||
| 445 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | ||
| 446 | pos = rcu_dereference_bh(pos->next)) | ||
| 447 | |||
| 448 | /** | ||
| 449 | * hlist_for_each_entry_continue_rcu - iterate over a hlist continuing after current point | ||
| 450 | * @tpos: the type * to use as a loop cursor. | ||
| 451 | * @pos: the &struct hlist_node to use as a loop cursor. | ||
| 452 | * @member: the name of the hlist_node within the struct. | ||
| 453 | */ | ||
| 454 | #define hlist_for_each_entry_continue_rcu(tpos, pos, member) \ | ||
| 455 | for (pos = rcu_dereference((pos)->next); \ | ||
| 456 | pos && ({ prefetch(pos->next); 1; }) && \ | ||
| 457 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | ||
| 458 | pos = rcu_dereference(pos->next)) | ||
| 459 | |||
| 460 | /** | ||
| 461 | * hlist_for_each_entry_continue_rcu_bh - iterate over a hlist continuing after current point | ||
| 462 | * @tpos: the type * to use as a loop cursor. | ||
| 463 | * @pos: the &struct hlist_node to use as a loop cursor. | ||
| 464 | * @member: the name of the hlist_node within the struct. | ||
| 465 | */ | ||
| 466 | #define hlist_for_each_entry_continue_rcu_bh(tpos, pos, member) \ | ||
| 467 | for (pos = rcu_dereference_bh((pos)->next); \ | ||
| 468 | pos && ({ prefetch(pos->next); 1; }) && \ | ||
| 469 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | ||
| 470 | pos = rcu_dereference_bh(pos->next)) | ||
| 471 | |||
| 472 | |||
| 431 | #endif /* __KERNEL__ */ | 473 | #endif /* __KERNEL__ */ |
| 432 | #endif | 474 | #endif |
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index d1c7c90e9cd4..fbc8cb0d48c3 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -7,6 +7,13 @@ | |||
| 7 | #include <linux/if_addr.h> | 7 | #include <linux/if_addr.h> |
| 8 | #include <linux/neighbour.h> | 8 | #include <linux/neighbour.h> |
| 9 | 9 | ||
| 10 | /* rtnetlink families. Values up to 127 are reserved for real address | ||
| 11 | * families, values above 128 may be used arbitrarily. | ||
| 12 | */ | ||
| 13 | #define RTNL_FAMILY_IPMR 128 | ||
| 14 | #define RTNL_FAMILY_IP6MR 129 | ||
| 15 | #define RTNL_FAMILY_MAX 129 | ||
| 16 | |||
| 10 | /**** | 17 | /**** |
| 11 | * Routing/neighbour discovery messages. | 18 | * Routing/neighbour discovery messages. |
| 12 | ****/ | 19 | ****/ |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 124f90cd5a38..7cdfb4d52847 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -187,7 +187,6 @@ union skb_shared_tx { | |||
| 187 | * the end of the header data, ie. at skb->end. | 187 | * the end of the header data, ie. at skb->end. |
| 188 | */ | 188 | */ |
| 189 | struct skb_shared_info { | 189 | struct skb_shared_info { |
| 190 | atomic_t dataref; | ||
| 191 | unsigned short nr_frags; | 190 | unsigned short nr_frags; |
| 192 | unsigned short gso_size; | 191 | unsigned short gso_size; |
| 193 | /* Warning: this field is not always filled in (UFO)! */ | 192 | /* Warning: this field is not always filled in (UFO)! */ |
| @@ -197,6 +196,12 @@ struct skb_shared_info { | |||
| 197 | union skb_shared_tx tx_flags; | 196 | union skb_shared_tx tx_flags; |
| 198 | struct sk_buff *frag_list; | 197 | struct sk_buff *frag_list; |
| 199 | struct skb_shared_hwtstamps hwtstamps; | 198 | struct skb_shared_hwtstamps hwtstamps; |
| 199 | |||
| 200 | /* | ||
| 201 | * Warning : all fields before dataref are cleared in __alloc_skb() | ||
| 202 | */ | ||
| 203 | atomic_t dataref; | ||
| 204 | |||
| 200 | skb_frag_t frags[MAX_SKB_FRAGS]; | 205 | skb_frag_t frags[MAX_SKB_FRAGS]; |
| 201 | /* Intermediate layers must ensure that destructor_arg | 206 | /* Intermediate layers must ensure that destructor_arg |
| 202 | * remains valid until skb destructor */ | 207 | * remains valid until skb destructor */ |
| @@ -259,7 +264,7 @@ typedef unsigned char *sk_buff_data_t; | |||
| 259 | * @transport_header: Transport layer header | 264 | * @transport_header: Transport layer header |
| 260 | * @network_header: Network layer header | 265 | * @network_header: Network layer header |
| 261 | * @mac_header: Link layer header | 266 | * @mac_header: Link layer header |
| 262 | * @_skb_dst: destination entry | 267 | * @_skb_refdst: destination entry (with norefcount bit) |
| 263 | * @sp: the security path, used for xfrm | 268 | * @sp: the security path, used for xfrm |
| 264 | * @cb: Control buffer. Free for use by every layer. Put private vars here | 269 | * @cb: Control buffer. Free for use by every layer. Put private vars here |
| 265 | * @len: Length of actual data | 270 | * @len: Length of actual data |
| @@ -294,6 +299,7 @@ typedef unsigned char *sk_buff_data_t; | |||
| 294 | * @nfct_reasm: netfilter conntrack re-assembly pointer | 299 | * @nfct_reasm: netfilter conntrack re-assembly pointer |
| 295 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c | 300 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c |
| 296 | * @skb_iif: ifindex of device we arrived on | 301 | * @skb_iif: ifindex of device we arrived on |
| 302 | * @rxhash: the packet hash computed on receive | ||
| 297 | * @queue_mapping: Queue mapping for multiqueue devices | 303 | * @queue_mapping: Queue mapping for multiqueue devices |
| 298 | * @tc_index: Traffic control index | 304 | * @tc_index: Traffic control index |
| 299 | * @tc_verd: traffic control verdict | 305 | * @tc_verd: traffic control verdict |
| @@ -322,7 +328,7 @@ struct sk_buff { | |||
| 322 | */ | 328 | */ |
| 323 | char cb[48] __aligned(8); | 329 | char cb[48] __aligned(8); |
| 324 | 330 | ||
| 325 | unsigned long _skb_dst; | 331 | unsigned long _skb_refdst; |
| 326 | #ifdef CONFIG_XFRM | 332 | #ifdef CONFIG_XFRM |
| 327 | struct sec_path *sp; | 333 | struct sec_path *sp; |
| 328 | #endif | 334 | #endif |
| @@ -369,6 +375,8 @@ struct sk_buff { | |||
| 369 | #endif | 375 | #endif |
| 370 | #endif | 376 | #endif |
| 371 | 377 | ||
| 378 | __u32 rxhash; | ||
| 379 | |||
| 372 | kmemcheck_bitfield_begin(flags2); | 380 | kmemcheck_bitfield_begin(flags2); |
| 373 | __u16 queue_mapping:16; | 381 | __u16 queue_mapping:16; |
| 374 | #ifdef CONFIG_IPV6_NDISC_NODETYPE | 382 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
| @@ -411,14 +419,64 @@ struct sk_buff { | |||
| 411 | 419 | ||
| 412 | #include <asm/system.h> | 420 | #include <asm/system.h> |
| 413 | 421 | ||
| 422 | /* | ||
| 423 | * skb might have a dst pointer attached, refcounted or not. | ||
| 424 | * _skb_refdst low order bit is set if refcount was _not_ taken | ||
| 425 | */ | ||
| 426 | #define SKB_DST_NOREF 1UL | ||
| 427 | #define SKB_DST_PTRMASK ~(SKB_DST_NOREF) | ||
| 428 | |||
| 429 | /** | ||
| 430 | * skb_dst - returns skb dst_entry | ||
| 431 | * @skb: buffer | ||
| 432 | * | ||
| 433 | * Returns skb dst_entry, regardless of reference taken or not. | ||
| 434 | */ | ||
| 414 | static inline struct dst_entry *skb_dst(const struct sk_buff *skb) | 435 | static inline struct dst_entry *skb_dst(const struct sk_buff *skb) |
| 415 | { | 436 | { |
| 416 | return (struct dst_entry *)skb->_skb_dst; | 437 | /* If refdst was not refcounted, check we still are in a |
| 438 | * rcu_read_lock section | ||
| 439 | */ | ||
| 440 | WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) && | ||
| 441 | !rcu_read_lock_held() && | ||
| 442 | !rcu_read_lock_bh_held()); | ||
| 443 | return (struct dst_entry *)(skb->_skb_refdst & SKB_DST_PTRMASK); | ||
| 417 | } | 444 | } |
| 418 | 445 | ||
| 446 | /** | ||
| 447 | * skb_dst_set - sets skb dst | ||
| 448 | * @skb: buffer | ||
| 449 | * @dst: dst entry | ||
| 450 | * | ||
| 451 | * Sets skb dst, assuming a reference was taken on dst and should | ||
| 452 | * be released by skb_dst_drop() | ||
| 453 | */ | ||
| 419 | static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | 454 | static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) |
| 420 | { | 455 | { |
| 421 | skb->_skb_dst = (unsigned long)dst; | 456 | skb->_skb_refdst = (unsigned long)dst; |
| 457 | } | ||
| 458 | |||
| 459 | /** | ||
| 460 | * skb_dst_set_noref - sets skb dst, without a reference | ||
| 461 | * @skb: buffer | ||
| 462 | * @dst: dst entry | ||
| 463 | * | ||
| 464 | * Sets skb dst, assuming a reference was not taken on dst | ||
| 465 | * skb_dst_drop() should not dst_release() this dst | ||
| 466 | */ | ||
| 467 | static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) | ||
| 468 | { | ||
| 469 | WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); | ||
| 470 | skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF; | ||
| 471 | } | ||
| 472 | |||
| 473 | /** | ||
| 474 | * skb_dst_is_noref - Test if skb dst isnt refcounted | ||
| 475 | * @skb: buffer | ||
| 476 | */ | ||
| 477 | static inline bool skb_dst_is_noref(const struct sk_buff *skb) | ||
| 478 | { | ||
| 479 | return (skb->_skb_refdst & SKB_DST_NOREF) && skb_dst(skb); | ||
| 422 | } | 480 | } |
| 423 | 481 | ||
| 424 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) | 482 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) |
| @@ -467,11 +525,6 @@ extern int skb_cow_data(struct sk_buff *skb, int tailbits, | |||
| 467 | struct sk_buff **trailer); | 525 | struct sk_buff **trailer); |
| 468 | extern int skb_pad(struct sk_buff *skb, int pad); | 526 | extern int skb_pad(struct sk_buff *skb, int pad); |
| 469 | #define dev_kfree_skb(a) consume_skb(a) | 527 | #define dev_kfree_skb(a) consume_skb(a) |
| 470 | #define dev_consume_skb(a) kfree_skb_clean(a) | ||
| 471 | extern void skb_over_panic(struct sk_buff *skb, int len, | ||
| 472 | void *here); | ||
| 473 | extern void skb_under_panic(struct sk_buff *skb, int len, | ||
| 474 | void *here); | ||
| 475 | 528 | ||
| 476 | extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | 529 | extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, |
| 477 | int getfrag(void *from, char *to, int offset, | 530 | int getfrag(void *from, char *to, int offset, |
| @@ -1130,6 +1183,11 @@ static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) | |||
| 1130 | return skb->data += len; | 1183 | return skb->data += len; |
| 1131 | } | 1184 | } |
| 1132 | 1185 | ||
| 1186 | static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int len) | ||
| 1187 | { | ||
| 1188 | return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); | ||
| 1189 | } | ||
| 1190 | |||
| 1133 | extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); | 1191 | extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); |
| 1134 | 1192 | ||
| 1135 | static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) | 1193 | static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) |
| @@ -1353,9 +1411,12 @@ static inline int skb_network_offset(const struct sk_buff *skb) | |||
| 1353 | * | 1411 | * |
| 1354 | * Various parts of the networking layer expect at least 32 bytes of | 1412 | * Various parts of the networking layer expect at least 32 bytes of |
| 1355 | * headroom, you should not reduce this. | 1413 | * headroom, you should not reduce this. |
| 1414 | * With RPS, we raised NET_SKB_PAD to 64 so that get_rps_cpus() fetches span | ||
| 1415 | * a 64 bytes aligned block to fit modern (>= 64 bytes) cache line sizes | ||
| 1416 | * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) | ||
| 1356 | */ | 1417 | */ |
| 1357 | #ifndef NET_SKB_PAD | 1418 | #ifndef NET_SKB_PAD |
| 1358 | #define NET_SKB_PAD 32 | 1419 | #define NET_SKB_PAD 64 |
| 1359 | #endif | 1420 | #endif |
| 1360 | 1421 | ||
| 1361 | extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); | 1422 | extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); |
diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 4435d1084755..52797714ade7 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h | |||
| @@ -100,6 +100,7 @@ enum | |||
| 100 | ICMP6_MIB_INMSGS, /* InMsgs */ | 100 | ICMP6_MIB_INMSGS, /* InMsgs */ |
| 101 | ICMP6_MIB_INERRORS, /* InErrors */ | 101 | ICMP6_MIB_INERRORS, /* InErrors */ |
| 102 | ICMP6_MIB_OUTMSGS, /* OutMsgs */ | 102 | ICMP6_MIB_OUTMSGS, /* OutMsgs */ |
| 103 | ICMP6_MIB_OUTERRORS, /* OutErrors */ | ||
| 103 | __ICMP6_MIB_MAX | 104 | __ICMP6_MIB_MAX |
| 104 | }; | 105 | }; |
| 105 | 106 | ||
| @@ -227,6 +228,7 @@ enum | |||
| 227 | LINUX_MIB_SACKSHIFTFALLBACK, | 228 | LINUX_MIB_SACKSHIFTFALLBACK, |
| 228 | LINUX_MIB_TCPBACKLOGDROP, | 229 | LINUX_MIB_TCPBACKLOGDROP, |
| 229 | LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ | 230 | LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ |
| 231 | LINUX_MIB_TCPDEFERACCEPTDROP, | ||
| 230 | __LINUX_MIB_MAX | 232 | __LINUX_MIB_MAX |
| 231 | }; | 233 | }; |
| 232 | 234 | ||
diff --git a/include/linux/socket.h b/include/linux/socket.h index 354cc5617f8b..032a19eb61b1 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -189,7 +189,8 @@ struct ucred { | |||
| 189 | #define AF_ISDN 34 /* mISDN sockets */ | 189 | #define AF_ISDN 34 /* mISDN sockets */ |
| 190 | #define AF_PHONET 35 /* Phonet sockets */ | 190 | #define AF_PHONET 35 /* Phonet sockets */ |
| 191 | #define AF_IEEE802154 36 /* IEEE802154 sockets */ | 191 | #define AF_IEEE802154 36 /* IEEE802154 sockets */ |
| 192 | #define AF_MAX 37 /* For now.. */ | 192 | #define AF_CAIF 37 /* CAIF sockets */ |
| 193 | #define AF_MAX 38 /* For now.. */ | ||
| 193 | 194 | ||
| 194 | /* Protocol families, same as address families. */ | 195 | /* Protocol families, same as address families. */ |
| 195 | #define PF_UNSPEC AF_UNSPEC | 196 | #define PF_UNSPEC AF_UNSPEC |
| @@ -229,6 +230,7 @@ struct ucred { | |||
| 229 | #define PF_ISDN AF_ISDN | 230 | #define PF_ISDN AF_ISDN |
| 230 | #define PF_PHONET AF_PHONET | 231 | #define PF_PHONET AF_PHONET |
| 231 | #define PF_IEEE802154 AF_IEEE802154 | 232 | #define PF_IEEE802154 AF_IEEE802154 |
| 233 | #define PF_CAIF AF_CAIF | ||
| 232 | #define PF_MAX AF_MAX | 234 | #define PF_MAX AF_MAX |
| 233 | 235 | ||
| 234 | /* Maximum queue length specifiable by listen. */ | 236 | /* Maximum queue length specifiable by listen. */ |
| @@ -301,6 +303,7 @@ struct ucred { | |||
| 301 | #define SOL_PNPIPE 275 | 303 | #define SOL_PNPIPE 275 |
| 302 | #define SOL_RDS 276 | 304 | #define SOL_RDS 276 |
| 303 | #define SOL_IUCV 277 | 305 | #define SOL_IUCV 277 |
| 306 | #define SOL_CAIF 278 | ||
| 304 | 307 | ||
| 305 | /* IPX options */ | 308 | /* IPX options */ |
| 306 | #define IPX_TYPE 1 | 309 | #define IPX_TYPE 1 |
diff --git a/include/linux/spi/wl12xx.h b/include/linux/spi/wl12xx.h index aed64ed3dc8a..a223ecbc71ef 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/spi/wl12xx.h | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | struct wl12xx_platform_data { | 27 | struct wl12xx_platform_data { |
| 28 | void (*set_power)(bool enable); | 28 | void (*set_power)(bool enable); |
| 29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ | ||
| 30 | int irq; | ||
| 29 | bool use_eeprom; | 31 | bool use_eeprom; |
| 30 | }; | 32 | }; |
| 31 | 33 | ||
diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index 24f988547361..a2608bff9c78 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h | |||
| @@ -305,6 +305,7 @@ struct ssb_bus { | |||
| 305 | /* ID information about the Chip. */ | 305 | /* ID information about the Chip. */ |
| 306 | u16 chip_id; | 306 | u16 chip_id; |
| 307 | u16 chip_rev; | 307 | u16 chip_rev; |
| 308 | u16 sprom_offset; | ||
| 308 | u16 sprom_size; /* number of words in sprom */ | 309 | u16 sprom_size; /* number of words in sprom */ |
| 309 | u8 chip_package; | 310 | u8 chip_package; |
| 310 | 311 | ||
| @@ -394,6 +395,9 @@ extern int ssb_bus_sdiobus_register(struct ssb_bus *bus, | |||
| 394 | 395 | ||
| 395 | extern void ssb_bus_unregister(struct ssb_bus *bus); | 396 | extern void ssb_bus_unregister(struct ssb_bus *bus); |
| 396 | 397 | ||
| 398 | /* Does the device have an SPROM? */ | ||
| 399 | extern bool ssb_is_sprom_available(struct ssb_bus *bus); | ||
| 400 | |||
| 397 | /* Set a fallback SPROM. | 401 | /* Set a fallback SPROM. |
| 398 | * See kdoc at the function definition for complete documentation. */ | 402 | * See kdoc at the function definition for complete documentation. */ |
| 399 | extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); | 403 | extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); |
diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index 4e27acf0a92f..2cdf249b4e5f 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h | |||
| @@ -53,6 +53,7 @@ | |||
| 53 | #define SSB_CHIPCO_CAP_64BIT 0x08000000 /* 64-bit Backplane */ | 53 | #define SSB_CHIPCO_CAP_64BIT 0x08000000 /* 64-bit Backplane */ |
| 54 | #define SSB_CHIPCO_CAP_PMU 0x10000000 /* PMU available (rev >= 20) */ | 54 | #define SSB_CHIPCO_CAP_PMU 0x10000000 /* PMU available (rev >= 20) */ |
| 55 | #define SSB_CHIPCO_CAP_ECI 0x20000000 /* ECI available (rev >= 20) */ | 55 | #define SSB_CHIPCO_CAP_ECI 0x20000000 /* ECI available (rev >= 20) */ |
| 56 | #define SSB_CHIPCO_CAP_SPROM 0x40000000 /* SPROM present */ | ||
| 56 | #define SSB_CHIPCO_CORECTL 0x0008 | 57 | #define SSB_CHIPCO_CORECTL 0x0008 |
| 57 | #define SSB_CHIPCO_CORECTL_UARTCLK0 0x00000001 /* Drive UART with internal clock */ | 58 | #define SSB_CHIPCO_CORECTL_UARTCLK0 0x00000001 /* Drive UART with internal clock */ |
| 58 | #define SSB_CHIPCO_CORECTL_SE 0x00000002 /* sync clk out enable (corerev >= 3) */ | 59 | #define SSB_CHIPCO_CORECTL_SE 0x00000002 /* sync clk out enable (corerev >= 3) */ |
| @@ -385,6 +386,7 @@ | |||
| 385 | 386 | ||
| 386 | 387 | ||
| 387 | /** Chip specific Chip-Status register contents. */ | 388 | /** Chip specific Chip-Status register contents. */ |
| 389 | #define SSB_CHIPCO_CHST_4322_SPROM_EXISTS 0x00000040 /* SPROM present */ | ||
| 388 | #define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL 0x00000003 | 390 | #define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL 0x00000003 |
| 389 | #define SSB_CHIPCO_CHST_4325_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ | 391 | #define SSB_CHIPCO_CHST_4325_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ |
| 390 | #define SSB_CHIPCO_CHST_4325_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ | 392 | #define SSB_CHIPCO_CHST_4325_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ |
| @@ -398,6 +400,18 @@ | |||
| 398 | #define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT 4 | 400 | #define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT 4 |
| 399 | #define SSB_CHIPCO_CHST_4325_PMUTOP_2B 0x00000200 /* 1 for 2b, 0 for to 2a */ | 401 | #define SSB_CHIPCO_CHST_4325_PMUTOP_2B 0x00000200 /* 1 for 2b, 0 for to 2a */ |
| 400 | 402 | ||
| 403 | /** Macros to determine SPROM presence based on Chip-Status register. */ | ||
| 404 | #define SSB_CHIPCO_CHST_4312_SPROM_PRESENT(status) \ | ||
| 405 | ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ | ||
| 406 | SSB_CHIPCO_CHST_4325_OTP_SEL) | ||
| 407 | #define SSB_CHIPCO_CHST_4322_SPROM_PRESENT(status) \ | ||
| 408 | (status & SSB_CHIPCO_CHST_4322_SPROM_EXISTS) | ||
| 409 | #define SSB_CHIPCO_CHST_4325_SPROM_PRESENT(status) \ | ||
| 410 | (((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ | ||
| 411 | SSB_CHIPCO_CHST_4325_DEFCIS_SEL) && \ | ||
| 412 | ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ | ||
| 413 | SSB_CHIPCO_CHST_4325_OTP_SEL)) | ||
| 414 | |||
| 401 | 415 | ||
| 402 | 416 | ||
| 403 | /** Clockcontrol masks and values **/ | 417 | /** Clockcontrol masks and values **/ |
| @@ -564,6 +578,7 @@ struct ssb_chipcommon_pmu { | |||
| 564 | struct ssb_chipcommon { | 578 | struct ssb_chipcommon { |
| 565 | struct ssb_device *dev; | 579 | struct ssb_device *dev; |
| 566 | u32 capabilities; | 580 | u32 capabilities; |
| 581 | u32 status; | ||
| 567 | /* Fast Powerup Delay constant */ | 582 | /* Fast Powerup Delay constant */ |
| 568 | u16 fast_pwrup_delay; | 583 | u16 fast_pwrup_delay; |
| 569 | struct ssb_chipcommon_pmu pmu; | 584 | struct ssb_chipcommon_pmu pmu; |
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index 9ae9082eaeb4..a6d5225b9275 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h | |||
| @@ -170,26 +170,27 @@ | |||
| 170 | #define SSB_SPROMSIZE_WORDS_R4 220 | 170 | #define SSB_SPROMSIZE_WORDS_R4 220 |
| 171 | #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) | 171 | #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) |
| 172 | #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) | 172 | #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) |
| 173 | #define SSB_SPROM_BASE 0x1000 | 173 | #define SSB_SPROM_BASE1 0x1000 |
| 174 | #define SSB_SPROM_REVISION 0x107E | 174 | #define SSB_SPROM_BASE31 0x0800 |
| 175 | #define SSB_SPROM_REVISION 0x007E | ||
| 175 | #define SSB_SPROM_REVISION_REV 0x00FF /* SPROM Revision number */ | 176 | #define SSB_SPROM_REVISION_REV 0x00FF /* SPROM Revision number */ |
| 176 | #define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */ | 177 | #define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */ |
| 177 | #define SSB_SPROM_REVISION_CRC_SHIFT 8 | 178 | #define SSB_SPROM_REVISION_CRC_SHIFT 8 |
| 178 | 179 | ||
| 179 | /* SPROM Revision 1 */ | 180 | /* SPROM Revision 1 */ |
| 180 | #define SSB_SPROM1_SPID 0x1004 /* Subsystem Product ID for PCI */ | 181 | #define SSB_SPROM1_SPID 0x0004 /* Subsystem Product ID for PCI */ |
| 181 | #define SSB_SPROM1_SVID 0x1006 /* Subsystem Vendor ID for PCI */ | 182 | #define SSB_SPROM1_SVID 0x0006 /* Subsystem Vendor ID for PCI */ |
| 182 | #define SSB_SPROM1_PID 0x1008 /* Product ID for PCI */ | 183 | #define SSB_SPROM1_PID 0x0008 /* Product ID for PCI */ |
| 183 | #define SSB_SPROM1_IL0MAC 0x1048 /* 6 bytes MAC address for 802.11b/g */ | 184 | #define SSB_SPROM1_IL0MAC 0x0048 /* 6 bytes MAC address for 802.11b/g */ |
| 184 | #define SSB_SPROM1_ET0MAC 0x104E /* 6 bytes MAC address for Ethernet */ | 185 | #define SSB_SPROM1_ET0MAC 0x004E /* 6 bytes MAC address for Ethernet */ |
| 185 | #define SSB_SPROM1_ET1MAC 0x1054 /* 6 bytes MAC address for 802.11a */ | 186 | #define SSB_SPROM1_ET1MAC 0x0054 /* 6 bytes MAC address for 802.11a */ |
| 186 | #define SSB_SPROM1_ETHPHY 0x105A /* Ethernet PHY settings */ | 187 | #define SSB_SPROM1_ETHPHY 0x005A /* Ethernet PHY settings */ |
| 187 | #define SSB_SPROM1_ETHPHY_ET0A 0x001F /* MII Address for enet0 */ | 188 | #define SSB_SPROM1_ETHPHY_ET0A 0x001F /* MII Address for enet0 */ |
| 188 | #define SSB_SPROM1_ETHPHY_ET1A 0x03E0 /* MII Address for enet1 */ | 189 | #define SSB_SPROM1_ETHPHY_ET1A 0x03E0 /* MII Address for enet1 */ |
| 189 | #define SSB_SPROM1_ETHPHY_ET1A_SHIFT 5 | 190 | #define SSB_SPROM1_ETHPHY_ET1A_SHIFT 5 |
| 190 | #define SSB_SPROM1_ETHPHY_ET0M (1<<14) /* MDIO for enet0 */ | 191 | #define SSB_SPROM1_ETHPHY_ET0M (1<<14) /* MDIO for enet0 */ |
| 191 | #define SSB_SPROM1_ETHPHY_ET1M (1<<15) /* MDIO for enet1 */ | 192 | #define SSB_SPROM1_ETHPHY_ET1M (1<<15) /* MDIO for enet1 */ |
| 192 | #define SSB_SPROM1_BINF 0x105C /* Board info */ | 193 | #define SSB_SPROM1_BINF 0x005C /* Board info */ |
| 193 | #define SSB_SPROM1_BINF_BREV 0x00FF /* Board Revision */ | 194 | #define SSB_SPROM1_BINF_BREV 0x00FF /* Board Revision */ |
| 194 | #define SSB_SPROM1_BINF_CCODE 0x0F00 /* Country Code */ | 195 | #define SSB_SPROM1_BINF_CCODE 0x0F00 /* Country Code */ |
| 195 | #define SSB_SPROM1_BINF_CCODE_SHIFT 8 | 196 | #define SSB_SPROM1_BINF_CCODE_SHIFT 8 |
| @@ -197,63 +198,63 @@ | |||
| 197 | #define SSB_SPROM1_BINF_ANTBG_SHIFT 12 | 198 | #define SSB_SPROM1_BINF_ANTBG_SHIFT 12 |
| 198 | #define SSB_SPROM1_BINF_ANTA 0xC000 /* Available A-PHY antennas */ | 199 | #define SSB_SPROM1_BINF_ANTA 0xC000 /* Available A-PHY antennas */ |
| 199 | #define SSB_SPROM1_BINF_ANTA_SHIFT 14 | 200 | #define SSB_SPROM1_BINF_ANTA_SHIFT 14 |
| 200 | #define SSB_SPROM1_PA0B0 0x105E | 201 | #define SSB_SPROM1_PA0B0 0x005E |
| 201 | #define SSB_SPROM1_PA0B1 0x1060 | 202 | #define SSB_SPROM1_PA0B1 0x0060 |
| 202 | #define SSB_SPROM1_PA0B2 0x1062 | 203 | #define SSB_SPROM1_PA0B2 0x0062 |
| 203 | #define SSB_SPROM1_GPIOA 0x1064 /* General Purpose IO pins 0 and 1 */ | 204 | #define SSB_SPROM1_GPIOA 0x0064 /* General Purpose IO pins 0 and 1 */ |
| 204 | #define SSB_SPROM1_GPIOA_P0 0x00FF /* Pin 0 */ | 205 | #define SSB_SPROM1_GPIOA_P0 0x00FF /* Pin 0 */ |
| 205 | #define SSB_SPROM1_GPIOA_P1 0xFF00 /* Pin 1 */ | 206 | #define SSB_SPROM1_GPIOA_P1 0xFF00 /* Pin 1 */ |
| 206 | #define SSB_SPROM1_GPIOA_P1_SHIFT 8 | 207 | #define SSB_SPROM1_GPIOA_P1_SHIFT 8 |
| 207 | #define SSB_SPROM1_GPIOB 0x1066 /* General Purpuse IO pins 2 and 3 */ | 208 | #define SSB_SPROM1_GPIOB 0x0066 /* General Purpuse IO pins 2 and 3 */ |
| 208 | #define SSB_SPROM1_GPIOB_P2 0x00FF /* Pin 2 */ | 209 | #define SSB_SPROM1_GPIOB_P2 0x00FF /* Pin 2 */ |
| 209 | #define SSB_SPROM1_GPIOB_P3 0xFF00 /* Pin 3 */ | 210 | #define SSB_SPROM1_GPIOB_P3 0xFF00 /* Pin 3 */ |
| 210 | #define SSB_SPROM1_GPIOB_P3_SHIFT 8 | 211 | #define SSB_SPROM1_GPIOB_P3_SHIFT 8 |
| 211 | #define SSB_SPROM1_MAXPWR 0x1068 /* Power Amplifier Max Power */ | 212 | #define SSB_SPROM1_MAXPWR 0x0068 /* Power Amplifier Max Power */ |
| 212 | #define SSB_SPROM1_MAXPWR_BG 0x00FF /* B-PHY and G-PHY (in dBm Q5.2) */ | 213 | #define SSB_SPROM1_MAXPWR_BG 0x00FF /* B-PHY and G-PHY (in dBm Q5.2) */ |
| 213 | #define SSB_SPROM1_MAXPWR_A 0xFF00 /* A-PHY (in dBm Q5.2) */ | 214 | #define SSB_SPROM1_MAXPWR_A 0xFF00 /* A-PHY (in dBm Q5.2) */ |
| 214 | #define SSB_SPROM1_MAXPWR_A_SHIFT 8 | 215 | #define SSB_SPROM1_MAXPWR_A_SHIFT 8 |
| 215 | #define SSB_SPROM1_PA1B0 0x106A | 216 | #define SSB_SPROM1_PA1B0 0x006A |
| 216 | #define SSB_SPROM1_PA1B1 0x106C | 217 | #define SSB_SPROM1_PA1B1 0x006C |
| 217 | #define SSB_SPROM1_PA1B2 0x106E | 218 | #define SSB_SPROM1_PA1B2 0x006E |
| 218 | #define SSB_SPROM1_ITSSI 0x1070 /* Idle TSSI Target */ | 219 | #define SSB_SPROM1_ITSSI 0x0070 /* Idle TSSI Target */ |
| 219 | #define SSB_SPROM1_ITSSI_BG 0x00FF /* B-PHY and G-PHY*/ | 220 | #define SSB_SPROM1_ITSSI_BG 0x00FF /* B-PHY and G-PHY*/ |
| 220 | #define SSB_SPROM1_ITSSI_A 0xFF00 /* A-PHY */ | 221 | #define SSB_SPROM1_ITSSI_A 0xFF00 /* A-PHY */ |
| 221 | #define SSB_SPROM1_ITSSI_A_SHIFT 8 | 222 | #define SSB_SPROM1_ITSSI_A_SHIFT 8 |
| 222 | #define SSB_SPROM1_BFLLO 0x1072 /* Boardflags (low 16 bits) */ | 223 | #define SSB_SPROM1_BFLLO 0x0072 /* Boardflags (low 16 bits) */ |
| 223 | #define SSB_SPROM1_AGAIN 0x1074 /* Antenna Gain (in dBm Q5.2) */ | 224 | #define SSB_SPROM1_AGAIN 0x0074 /* Antenna Gain (in dBm Q5.2) */ |
| 224 | #define SSB_SPROM1_AGAIN_BG 0x00FF /* B-PHY and G-PHY */ | 225 | #define SSB_SPROM1_AGAIN_BG 0x00FF /* B-PHY and G-PHY */ |
| 225 | #define SSB_SPROM1_AGAIN_BG_SHIFT 0 | 226 | #define SSB_SPROM1_AGAIN_BG_SHIFT 0 |
| 226 | #define SSB_SPROM1_AGAIN_A 0xFF00 /* A-PHY */ | 227 | #define SSB_SPROM1_AGAIN_A 0xFF00 /* A-PHY */ |
| 227 | #define SSB_SPROM1_AGAIN_A_SHIFT 8 | 228 | #define SSB_SPROM1_AGAIN_A_SHIFT 8 |
| 228 | 229 | ||
| 229 | /* SPROM Revision 2 (inherits from rev 1) */ | 230 | /* SPROM Revision 2 (inherits from rev 1) */ |
| 230 | #define SSB_SPROM2_BFLHI 0x1038 /* Boardflags (high 16 bits) */ | 231 | #define SSB_SPROM2_BFLHI 0x0038 /* Boardflags (high 16 bits) */ |
| 231 | #define SSB_SPROM2_MAXP_A 0x103A /* A-PHY Max Power */ | 232 | #define SSB_SPROM2_MAXP_A 0x003A /* A-PHY Max Power */ |
| 232 | #define SSB_SPROM2_MAXP_A_HI 0x00FF /* Max Power High */ | 233 | #define SSB_SPROM2_MAXP_A_HI 0x00FF /* Max Power High */ |
| 233 | #define SSB_SPROM2_MAXP_A_LO 0xFF00 /* Max Power Low */ | 234 | #define SSB_SPROM2_MAXP_A_LO 0xFF00 /* Max Power Low */ |
| 234 | #define SSB_SPROM2_MAXP_A_LO_SHIFT 8 | 235 | #define SSB_SPROM2_MAXP_A_LO_SHIFT 8 |
| 235 | #define SSB_SPROM2_PA1LOB0 0x103C /* A-PHY PowerAmplifier Low Settings */ | 236 | #define SSB_SPROM2_PA1LOB0 0x003C /* A-PHY PowerAmplifier Low Settings */ |
| 236 | #define SSB_SPROM2_PA1LOB1 0x103E /* A-PHY PowerAmplifier Low Settings */ | 237 | #define SSB_SPROM2_PA1LOB1 0x003E /* A-PHY PowerAmplifier Low Settings */ |
| 237 | #define SSB_SPROM2_PA1LOB2 0x1040 /* A-PHY PowerAmplifier Low Settings */ | 238 | #define SSB_SPROM2_PA1LOB2 0x0040 /* A-PHY PowerAmplifier Low Settings */ |
| 238 | #define SSB_SPROM2_PA1HIB0 0x1042 /* A-PHY PowerAmplifier High Settings */ | 239 | #define SSB_SPROM2_PA1HIB0 0x0042 /* A-PHY PowerAmplifier High Settings */ |
| 239 | #define SSB_SPROM2_PA1HIB1 0x1044 /* A-PHY PowerAmplifier High Settings */ | 240 | #define SSB_SPROM2_PA1HIB1 0x0044 /* A-PHY PowerAmplifier High Settings */ |
| 240 | #define SSB_SPROM2_PA1HIB2 0x1046 /* A-PHY PowerAmplifier High Settings */ | 241 | #define SSB_SPROM2_PA1HIB2 0x0046 /* A-PHY PowerAmplifier High Settings */ |
| 241 | #define SSB_SPROM2_OPO 0x1078 /* OFDM Power Offset from CCK Level */ | 242 | #define SSB_SPROM2_OPO 0x0078 /* OFDM Power Offset from CCK Level */ |
| 242 | #define SSB_SPROM2_OPO_VALUE 0x00FF | 243 | #define SSB_SPROM2_OPO_VALUE 0x00FF |
| 243 | #define SSB_SPROM2_OPO_UNUSED 0xFF00 | 244 | #define SSB_SPROM2_OPO_UNUSED 0xFF00 |
| 244 | #define SSB_SPROM2_CCODE 0x107C /* Two char Country Code */ | 245 | #define SSB_SPROM2_CCODE 0x007C /* Two char Country Code */ |
| 245 | 246 | ||
| 246 | /* SPROM Revision 3 (inherits most data from rev 2) */ | 247 | /* SPROM Revision 3 (inherits most data from rev 2) */ |
| 247 | #define SSB_SPROM3_IL0MAC 0x104A /* 6 bytes MAC address for 802.11b/g */ | 248 | #define SSB_SPROM3_OFDMAPO 0x002C /* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ |
| 248 | #define SSB_SPROM3_OFDMAPO 0x102C /* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ | 249 | #define SSB_SPROM3_OFDMALPO 0x0030 /* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ |
| 249 | #define SSB_SPROM3_OFDMALPO 0x1030 /* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ | 250 | #define SSB_SPROM3_OFDMAHPO 0x0034 /* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ |
| 250 | #define SSB_SPROM3_OFDMAHPO 0x1034 /* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ | 251 | #define SSB_SPROM3_GPIOLDC 0x0042 /* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */ |
| 251 | #define SSB_SPROM3_GPIOLDC 0x1042 /* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */ | ||
| 252 | #define SSB_SPROM3_GPIOLDC_OFF 0x0000FF00 /* Off Count */ | 252 | #define SSB_SPROM3_GPIOLDC_OFF 0x0000FF00 /* Off Count */ |
| 253 | #define SSB_SPROM3_GPIOLDC_OFF_SHIFT 8 | 253 | #define SSB_SPROM3_GPIOLDC_OFF_SHIFT 8 |
| 254 | #define SSB_SPROM3_GPIOLDC_ON 0x00FF0000 /* On Count */ | 254 | #define SSB_SPROM3_GPIOLDC_ON 0x00FF0000 /* On Count */ |
| 255 | #define SSB_SPROM3_GPIOLDC_ON_SHIFT 16 | 255 | #define SSB_SPROM3_GPIOLDC_ON_SHIFT 16 |
| 256 | #define SSB_SPROM3_CCKPO 0x1078 /* CCK Power Offset */ | 256 | #define SSB_SPROM3_IL0MAC 0x004A /* 6 bytes MAC address for 802.11b/g */ |
| 257 | #define SSB_SPROM3_CCKPO 0x0078 /* CCK Power Offset */ | ||
| 257 | #define SSB_SPROM3_CCKPO_1M 0x000F /* 1M Rate PO */ | 258 | #define SSB_SPROM3_CCKPO_1M 0x000F /* 1M Rate PO */ |
| 258 | #define SSB_SPROM3_CCKPO_2M 0x00F0 /* 2M Rate PO */ | 259 | #define SSB_SPROM3_CCKPO_2M 0x00F0 /* 2M Rate PO */ |
| 259 | #define SSB_SPROM3_CCKPO_2M_SHIFT 4 | 260 | #define SSB_SPROM3_CCKPO_2M_SHIFT 4 |
| @@ -264,100 +265,100 @@ | |||
| 264 | #define SSB_SPROM3_OFDMGPO 0x107A /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ | 265 | #define SSB_SPROM3_OFDMGPO 0x107A /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ |
| 265 | 266 | ||
| 266 | /* SPROM Revision 4 */ | 267 | /* SPROM Revision 4 */ |
| 267 | #define SSB_SPROM4_IL0MAC 0x104C /* 6 byte MAC address for a/b/g/n */ | 268 | #define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */ |
| 268 | #define SSB_SPROM4_ETHPHY 0x105A /* Ethernet PHY settings ?? */ | 269 | #define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */ |
| 270 | #define SSB_SPROM4_IL0MAC 0x004C /* 6 byte MAC address for a/b/g/n */ | ||
| 271 | #define SSB_SPROM4_CCODE 0x0052 /* Country Code (2 bytes) */ | ||
| 272 | #define SSB_SPROM4_GPIOA 0x0056 /* Gen. Purpose IO # 0 and 1 */ | ||
| 273 | #define SSB_SPROM4_GPIOA_P0 0x00FF /* Pin 0 */ | ||
| 274 | #define SSB_SPROM4_GPIOA_P1 0xFF00 /* Pin 1 */ | ||
| 275 | #define SSB_SPROM4_GPIOA_P1_SHIFT 8 | ||
| 276 | #define SSB_SPROM4_GPIOB 0x0058 /* Gen. Purpose IO # 2 and 3 */ | ||
| 277 | #define SSB_SPROM4_GPIOB_P2 0x00FF /* Pin 2 */ | ||
| 278 | #define SSB_SPROM4_GPIOB_P3 0xFF00 /* Pin 3 */ | ||
| 279 | #define SSB_SPROM4_GPIOB_P3_SHIFT 8 | ||
| 280 | #define SSB_SPROM4_ETHPHY 0x005A /* Ethernet PHY settings ?? */ | ||
| 269 | #define SSB_SPROM4_ETHPHY_ET0A 0x001F /* MII Address for enet0 */ | 281 | #define SSB_SPROM4_ETHPHY_ET0A 0x001F /* MII Address for enet0 */ |
| 270 | #define SSB_SPROM4_ETHPHY_ET1A 0x03E0 /* MII Address for enet1 */ | 282 | #define SSB_SPROM4_ETHPHY_ET1A 0x03E0 /* MII Address for enet1 */ |
| 271 | #define SSB_SPROM4_ETHPHY_ET1A_SHIFT 5 | 283 | #define SSB_SPROM4_ETHPHY_ET1A_SHIFT 5 |
| 272 | #define SSB_SPROM4_ETHPHY_ET0M (1<<14) /* MDIO for enet0 */ | 284 | #define SSB_SPROM4_ETHPHY_ET0M (1<<14) /* MDIO for enet0 */ |
| 273 | #define SSB_SPROM4_ETHPHY_ET1M (1<<15) /* MDIO for enet1 */ | 285 | #define SSB_SPROM4_ETHPHY_ET1M (1<<15) /* MDIO for enet1 */ |
| 274 | #define SSB_SPROM4_CCODE 0x1052 /* Country Code (2 bytes) */ | 286 | #define SSB_SPROM4_ANTAVAIL 0x005D /* Antenna available bitfields */ |
| 275 | #define SSB_SPROM4_ANTAVAIL 0x105D /* Antenna available bitfields */ | 287 | #define SSB_SPROM4_ANTAVAIL_A 0x00FF /* A-PHY bitfield */ |
| 276 | #define SSB_SPROM4_ANTAVAIL_A 0x00FF /* A-PHY bitfield */ | 288 | #define SSB_SPROM4_ANTAVAIL_A_SHIFT 0 |
| 277 | #define SSB_SPROM4_ANTAVAIL_A_SHIFT 0 | 289 | #define SSB_SPROM4_ANTAVAIL_BG 0xFF00 /* B-PHY and G-PHY bitfield */ |
| 278 | #define SSB_SPROM4_ANTAVAIL_BG 0xFF00 /* B-PHY and G-PHY bitfield */ | 290 | #define SSB_SPROM4_ANTAVAIL_BG_SHIFT 8 |
| 279 | #define SSB_SPROM4_ANTAVAIL_BG_SHIFT 8 | 291 | #define SSB_SPROM4_AGAIN01 0x005E /* Antenna Gain (in dBm Q5.2) */ |
| 280 | #define SSB_SPROM4_BFLLO 0x1044 /* Boardflags (low 16 bits) */ | ||
| 281 | #define SSB_SPROM4_AGAIN01 0x105E /* Antenna Gain (in dBm Q5.2) */ | ||
| 282 | #define SSB_SPROM4_AGAIN0 0x00FF /* Antenna 0 */ | 292 | #define SSB_SPROM4_AGAIN0 0x00FF /* Antenna 0 */ |
| 283 | #define SSB_SPROM4_AGAIN0_SHIFT 0 | 293 | #define SSB_SPROM4_AGAIN0_SHIFT 0 |
| 284 | #define SSB_SPROM4_AGAIN1 0xFF00 /* Antenna 1 */ | 294 | #define SSB_SPROM4_AGAIN1 0xFF00 /* Antenna 1 */ |
| 285 | #define SSB_SPROM4_AGAIN1_SHIFT 8 | 295 | #define SSB_SPROM4_AGAIN1_SHIFT 8 |
| 286 | #define SSB_SPROM4_AGAIN23 0x1060 | 296 | #define SSB_SPROM4_AGAIN23 0x0060 |
| 287 | #define SSB_SPROM4_AGAIN2 0x00FF /* Antenna 2 */ | 297 | #define SSB_SPROM4_AGAIN2 0x00FF /* Antenna 2 */ |
| 288 | #define SSB_SPROM4_AGAIN2_SHIFT 0 | 298 | #define SSB_SPROM4_AGAIN2_SHIFT 0 |
| 289 | #define SSB_SPROM4_AGAIN3 0xFF00 /* Antenna 3 */ | 299 | #define SSB_SPROM4_AGAIN3 0xFF00 /* Antenna 3 */ |
| 290 | #define SSB_SPROM4_AGAIN3_SHIFT 8 | 300 | #define SSB_SPROM4_AGAIN3_SHIFT 8 |
| 291 | #define SSB_SPROM4_BFLHI 0x1046 /* Board Flags Hi */ | 301 | #define SSB_SPROM4_MAXP_BG 0x0080 /* Max Power BG in path 1 */ |
| 292 | #define SSB_SPROM4_MAXP_BG 0x1080 /* Max Power BG in path 1 */ | ||
| 293 | #define SSB_SPROM4_MAXP_BG_MASK 0x00FF /* Mask for Max Power BG */ | 302 | #define SSB_SPROM4_MAXP_BG_MASK 0x00FF /* Mask for Max Power BG */ |
| 294 | #define SSB_SPROM4_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */ | 303 | #define SSB_SPROM4_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */ |
| 295 | #define SSB_SPROM4_ITSSI_BG_SHIFT 8 | 304 | #define SSB_SPROM4_ITSSI_BG_SHIFT 8 |
| 296 | #define SSB_SPROM4_MAXP_A 0x108A /* Max Power A in path 1 */ | 305 | #define SSB_SPROM4_MAXP_A 0x008A /* Max Power A in path 1 */ |
| 297 | #define SSB_SPROM4_MAXP_A_MASK 0x00FF /* Mask for Max Power A */ | 306 | #define SSB_SPROM4_MAXP_A_MASK 0x00FF /* Mask for Max Power A */ |
| 298 | #define SSB_SPROM4_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */ | 307 | #define SSB_SPROM4_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */ |
| 299 | #define SSB_SPROM4_ITSSI_A_SHIFT 8 | 308 | #define SSB_SPROM4_ITSSI_A_SHIFT 8 |
| 300 | #define SSB_SPROM4_GPIOA 0x1056 /* Gen. Purpose IO # 0 and 1 */ | 309 | #define SSB_SPROM4_PA0B0 0x0082 /* The paXbY locations are */ |
| 301 | #define SSB_SPROM4_GPIOA_P0 0x00FF /* Pin 0 */ | 310 | #define SSB_SPROM4_PA0B1 0x0084 /* only guesses */ |
| 302 | #define SSB_SPROM4_GPIOA_P1 0xFF00 /* Pin 1 */ | 311 | #define SSB_SPROM4_PA0B2 0x0086 |
| 303 | #define SSB_SPROM4_GPIOA_P1_SHIFT 8 | 312 | #define SSB_SPROM4_PA1B0 0x008E |
| 304 | #define SSB_SPROM4_GPIOB 0x1058 /* Gen. Purpose IO # 2 and 3 */ | 313 | #define SSB_SPROM4_PA1B1 0x0090 |
| 305 | #define SSB_SPROM4_GPIOB_P2 0x00FF /* Pin 2 */ | 314 | #define SSB_SPROM4_PA1B2 0x0092 |
| 306 | #define SSB_SPROM4_GPIOB_P3 0xFF00 /* Pin 3 */ | ||
| 307 | #define SSB_SPROM4_GPIOB_P3_SHIFT 8 | ||
| 308 | #define SSB_SPROM4_PA0B0 0x1082 /* The paXbY locations are */ | ||
| 309 | #define SSB_SPROM4_PA0B1 0x1084 /* only guesses */ | ||
| 310 | #define SSB_SPROM4_PA0B2 0x1086 | ||
| 311 | #define SSB_SPROM4_PA1B0 0x108E | ||
| 312 | #define SSB_SPROM4_PA1B1 0x1090 | ||
| 313 | #define SSB_SPROM4_PA1B2 0x1092 | ||
| 314 | 315 | ||
| 315 | /* SPROM Revision 5 (inherits most data from rev 4) */ | 316 | /* SPROM Revision 5 (inherits most data from rev 4) */ |
| 316 | #define SSB_SPROM5_BFLLO 0x104A /* Boardflags (low 16 bits) */ | 317 | #define SSB_SPROM5_CCODE 0x0044 /* Country Code (2 bytes) */ |
| 317 | #define SSB_SPROM5_BFLHI 0x104C /* Board Flags Hi */ | 318 | #define SSB_SPROM5_BFLLO 0x004A /* Boardflags (low 16 bits) */ |
| 318 | #define SSB_SPROM5_IL0MAC 0x1052 /* 6 byte MAC address for a/b/g/n */ | 319 | #define SSB_SPROM5_BFLHI 0x004C /* Board Flags Hi */ |
| 319 | #define SSB_SPROM5_CCODE 0x1044 /* Country Code (2 bytes) */ | 320 | #define SSB_SPROM5_IL0MAC 0x0052 /* 6 byte MAC address for a/b/g/n */ |
| 320 | #define SSB_SPROM5_GPIOA 0x1076 /* Gen. Purpose IO # 0 and 1 */ | 321 | #define SSB_SPROM5_GPIOA 0x0076 /* Gen. Purpose IO # 0 and 1 */ |
| 321 | #define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */ | 322 | #define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */ |
| 322 | #define SSB_SPROM5_GPIOA_P1 0xFF00 /* Pin 1 */ | 323 | #define SSB_SPROM5_GPIOA_P1 0xFF00 /* Pin 1 */ |
| 323 | #define SSB_SPROM5_GPIOA_P1_SHIFT 8 | 324 | #define SSB_SPROM5_GPIOA_P1_SHIFT 8 |
| 324 | #define SSB_SPROM5_GPIOB 0x1078 /* Gen. Purpose IO # 2 and 3 */ | 325 | #define SSB_SPROM5_GPIOB 0x0078 /* Gen. Purpose IO # 2 and 3 */ |
| 325 | #define SSB_SPROM5_GPIOB_P2 0x00FF /* Pin 2 */ | 326 | #define SSB_SPROM5_GPIOB_P2 0x00FF /* Pin 2 */ |
| 326 | #define SSB_SPROM5_GPIOB_P3 0xFF00 /* Pin 3 */ | 327 | #define SSB_SPROM5_GPIOB_P3 0xFF00 /* Pin 3 */ |
| 327 | #define SSB_SPROM5_GPIOB_P3_SHIFT 8 | 328 | #define SSB_SPROM5_GPIOB_P3_SHIFT 8 |
| 328 | 329 | ||
| 329 | /* SPROM Revision 8 */ | 330 | /* SPROM Revision 8 */ |
| 330 | #define SSB_SPROM8_BOARDREV 0x1082 /* Board revision */ | 331 | #define SSB_SPROM8_BOARDREV 0x0082 /* Board revision */ |
| 331 | #define SSB_SPROM8_BFLLO 0x1084 /* Board flags (bits 0-15) */ | 332 | #define SSB_SPROM8_BFLLO 0x0084 /* Board flags (bits 0-15) */ |
| 332 | #define SSB_SPROM8_BFLHI 0x1086 /* Board flags (bits 16-31) */ | 333 | #define SSB_SPROM8_BFLHI 0x0086 /* Board flags (bits 16-31) */ |
| 333 | #define SSB_SPROM8_BFL2LO 0x1088 /* Board flags (bits 32-47) */ | 334 | #define SSB_SPROM8_BFL2LO 0x0088 /* Board flags (bits 32-47) */ |
| 334 | #define SSB_SPROM8_BFL2HI 0x108A /* Board flags (bits 48-63) */ | 335 | #define SSB_SPROM8_BFL2HI 0x008A /* Board flags (bits 48-63) */ |
| 335 | #define SSB_SPROM8_IL0MAC 0x108C /* 6 byte MAC address */ | 336 | #define SSB_SPROM8_IL0MAC 0x008C /* 6 byte MAC address */ |
| 336 | #define SSB_SPROM8_CCODE 0x1092 /* 2 byte country code */ | 337 | #define SSB_SPROM8_CCODE 0x0092 /* 2 byte country code */ |
| 337 | #define SSB_SPROM8_ANTAVAIL 0x109C /* Antenna available bitfields*/ | 338 | #define SSB_SPROM8_GPIOA 0x0096 /*Gen. Purpose IO # 0 and 1 */ |
| 338 | #define SSB_SPROM8_ANTAVAIL_A 0xFF00 /* A-PHY bitfield */ | 339 | #define SSB_SPROM8_GPIOA_P0 0x00FF /* Pin 0 */ |
| 339 | #define SSB_SPROM8_ANTAVAIL_A_SHIFT 8 | 340 | #define SSB_SPROM8_GPIOA_P1 0xFF00 /* Pin 1 */ |
| 340 | #define SSB_SPROM8_ANTAVAIL_BG 0x00FF /* B-PHY and G-PHY bitfield */ | 341 | #define SSB_SPROM8_GPIOA_P1_SHIFT 8 |
| 341 | #define SSB_SPROM8_ANTAVAIL_BG_SHIFT 0 | 342 | #define SSB_SPROM8_GPIOB 0x0098 /* Gen. Purpose IO # 2 and 3 */ |
| 342 | #define SSB_SPROM8_AGAIN01 0x109E /* Antenna Gain (in dBm Q5.2) */ | 343 | #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */ |
| 344 | #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */ | ||
| 345 | #define SSB_SPROM8_GPIOB_P3_SHIFT 8 | ||
| 346 | #define SSB_SPROM8_ANTAVAIL 0x009C /* Antenna available bitfields*/ | ||
| 347 | #define SSB_SPROM8_ANTAVAIL_A 0xFF00 /* A-PHY bitfield */ | ||
| 348 | #define SSB_SPROM8_ANTAVAIL_A_SHIFT 8 | ||
| 349 | #define SSB_SPROM8_ANTAVAIL_BG 0x00FF /* B-PHY and G-PHY bitfield */ | ||
| 350 | #define SSB_SPROM8_ANTAVAIL_BG_SHIFT 0 | ||
| 351 | #define SSB_SPROM8_AGAIN01 0x009E /* Antenna Gain (in dBm Q5.2) */ | ||
| 343 | #define SSB_SPROM8_AGAIN0 0x00FF /* Antenna 0 */ | 352 | #define SSB_SPROM8_AGAIN0 0x00FF /* Antenna 0 */ |
| 344 | #define SSB_SPROM8_AGAIN0_SHIFT 0 | 353 | #define SSB_SPROM8_AGAIN0_SHIFT 0 |
| 345 | #define SSB_SPROM8_AGAIN1 0xFF00 /* Antenna 1 */ | 354 | #define SSB_SPROM8_AGAIN1 0xFF00 /* Antenna 1 */ |
| 346 | #define SSB_SPROM8_AGAIN1_SHIFT 8 | 355 | #define SSB_SPROM8_AGAIN1_SHIFT 8 |
| 347 | #define SSB_SPROM8_AGAIN23 0x10A0 | 356 | #define SSB_SPROM8_AGAIN23 0x00A0 |
| 348 | #define SSB_SPROM8_AGAIN2 0x00FF /* Antenna 2 */ | 357 | #define SSB_SPROM8_AGAIN2 0x00FF /* Antenna 2 */ |
| 349 | #define SSB_SPROM8_AGAIN2_SHIFT 0 | 358 | #define SSB_SPROM8_AGAIN2_SHIFT 0 |
| 350 | #define SSB_SPROM8_AGAIN3 0xFF00 /* Antenna 3 */ | 359 | #define SSB_SPROM8_AGAIN3 0xFF00 /* Antenna 3 */ |
| 351 | #define SSB_SPROM8_AGAIN3_SHIFT 8 | 360 | #define SSB_SPROM8_AGAIN3_SHIFT 8 |
| 352 | #define SSB_SPROM8_GPIOA 0x1096 /*Gen. Purpose IO # 0 and 1 */ | 361 | #define SSB_SPROM8_RSSIPARM2G 0x00A4 /* RSSI params for 2GHz */ |
| 353 | #define SSB_SPROM8_GPIOA_P0 0x00FF /* Pin 0 */ | ||
| 354 | #define SSB_SPROM8_GPIOA_P1 0xFF00 /* Pin 1 */ | ||
| 355 | #define SSB_SPROM8_GPIOA_P1_SHIFT 8 | ||
| 356 | #define SSB_SPROM8_GPIOB 0x1098 /* Gen. Purpose IO # 2 and 3 */ | ||
| 357 | #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */ | ||
| 358 | #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */ | ||
| 359 | #define SSB_SPROM8_GPIOB_P3_SHIFT 8 | ||
| 360 | #define SSB_SPROM8_RSSIPARM2G 0x10A4 /* RSSI params for 2GHz */ | ||
| 361 | #define SSB_SPROM8_RSSISMF2G 0x000F | 362 | #define SSB_SPROM8_RSSISMF2G 0x000F |
| 362 | #define SSB_SPROM8_RSSISMC2G 0x00F0 | 363 | #define SSB_SPROM8_RSSISMC2G 0x00F0 |
| 363 | #define SSB_SPROM8_RSSISMC2G_SHIFT 4 | 364 | #define SSB_SPROM8_RSSISMC2G_SHIFT 4 |
| @@ -365,7 +366,7 @@ | |||
| 365 | #define SSB_SPROM8_RSSISAV2G_SHIFT 8 | 366 | #define SSB_SPROM8_RSSISAV2G_SHIFT 8 |
| 366 | #define SSB_SPROM8_BXA2G 0x1800 | 367 | #define SSB_SPROM8_BXA2G 0x1800 |
| 367 | #define SSB_SPROM8_BXA2G_SHIFT 11 | 368 | #define SSB_SPROM8_BXA2G_SHIFT 11 |
| 368 | #define SSB_SPROM8_RSSIPARM5G 0x10A6 /* RSSI params for 5GHz */ | 369 | #define SSB_SPROM8_RSSIPARM5G 0x00A6 /* RSSI params for 5GHz */ |
| 369 | #define SSB_SPROM8_RSSISMF5G 0x000F | 370 | #define SSB_SPROM8_RSSISMF5G 0x000F |
| 370 | #define SSB_SPROM8_RSSISMC5G 0x00F0 | 371 | #define SSB_SPROM8_RSSISMC5G 0x00F0 |
| 371 | #define SSB_SPROM8_RSSISMC5G_SHIFT 4 | 372 | #define SSB_SPROM8_RSSISMC5G_SHIFT 4 |
| @@ -373,47 +374,47 @@ | |||
| 373 | #define SSB_SPROM8_RSSISAV5G_SHIFT 8 | 374 | #define SSB_SPROM8_RSSISAV5G_SHIFT 8 |
| 374 | #define SSB_SPROM8_BXA5G 0x1800 | 375 | #define SSB_SPROM8_BXA5G 0x1800 |
| 375 | #define SSB_SPROM8_BXA5G_SHIFT 11 | 376 | #define SSB_SPROM8_BXA5G_SHIFT 11 |
| 376 | #define SSB_SPROM8_TRI25G 0x10A8 /* TX isolation 2.4&5.3GHz */ | 377 | #define SSB_SPROM8_TRI25G 0x00A8 /* TX isolation 2.4&5.3GHz */ |
| 377 | #define SSB_SPROM8_TRI2G 0x00FF /* TX isolation 2.4GHz */ | 378 | #define SSB_SPROM8_TRI2G 0x00FF /* TX isolation 2.4GHz */ |
| 378 | #define SSB_SPROM8_TRI5G 0xFF00 /* TX isolation 5.3GHz */ | 379 | #define SSB_SPROM8_TRI5G 0xFF00 /* TX isolation 5.3GHz */ |
| 379 | #define SSB_SPROM8_TRI5G_SHIFT 8 | 380 | #define SSB_SPROM8_TRI5G_SHIFT 8 |
| 380 | #define SSB_SPROM8_TRI5GHL 0x10AA /* TX isolation 5.2/5.8GHz */ | 381 | #define SSB_SPROM8_TRI5GHL 0x00AA /* TX isolation 5.2/5.8GHz */ |
| 381 | #define SSB_SPROM8_TRI5GL 0x00FF /* TX isolation 5.2GHz */ | 382 | #define SSB_SPROM8_TRI5GL 0x00FF /* TX isolation 5.2GHz */ |
| 382 | #define SSB_SPROM8_TRI5GH 0xFF00 /* TX isolation 5.8GHz */ | 383 | #define SSB_SPROM8_TRI5GH 0xFF00 /* TX isolation 5.8GHz */ |
| 383 | #define SSB_SPROM8_TRI5GH_SHIFT 8 | 384 | #define SSB_SPROM8_TRI5GH_SHIFT 8 |
| 384 | #define SSB_SPROM8_RXPO 0x10AC /* RX power offsets */ | 385 | #define SSB_SPROM8_RXPO 0x00AC /* RX power offsets */ |
| 385 | #define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */ | 386 | #define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */ |
| 386 | #define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */ | 387 | #define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */ |
| 387 | #define SSB_SPROM8_RXPO5G_SHIFT 8 | 388 | #define SSB_SPROM8_RXPO5G_SHIFT 8 |
| 388 | #define SSB_SPROM8_MAXP_BG 0x10C0 /* Max Power 2GHz in path 1 */ | 389 | #define SSB_SPROM8_MAXP_BG 0x00C0 /* Max Power 2GHz in path 1 */ |
| 389 | #define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power 2GHz */ | 390 | #define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power 2GHz */ |
| 390 | #define SSB_SPROM8_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */ | 391 | #define SSB_SPROM8_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */ |
| 391 | #define SSB_SPROM8_ITSSI_BG_SHIFT 8 | 392 | #define SSB_SPROM8_ITSSI_BG_SHIFT 8 |
| 392 | #define SSB_SPROM8_PA0B0 0x10C2 /* 2GHz power amp settings */ | 393 | #define SSB_SPROM8_PA0B0 0x00C2 /* 2GHz power amp settings */ |
| 393 | #define SSB_SPROM8_PA0B1 0x10C4 | 394 | #define SSB_SPROM8_PA0B1 0x00C4 |
| 394 | #define SSB_SPROM8_PA0B2 0x10C6 | 395 | #define SSB_SPROM8_PA0B2 0x00C6 |
| 395 | #define SSB_SPROM8_MAXP_A 0x10C8 /* Max Power 5.3GHz */ | 396 | #define SSB_SPROM8_MAXP_A 0x00C8 /* Max Power 5.3GHz */ |
| 396 | #define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power 5.3GHz */ | 397 | #define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power 5.3GHz */ |
| 397 | #define SSB_SPROM8_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */ | 398 | #define SSB_SPROM8_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */ |
| 398 | #define SSB_SPROM8_ITSSI_A_SHIFT 8 | 399 | #define SSB_SPROM8_ITSSI_A_SHIFT 8 |
| 399 | #define SSB_SPROM8_MAXP_AHL 0x10CA /* Max Power 5.2/5.8GHz */ | 400 | #define SSB_SPROM8_MAXP_AHL 0x00CA /* Max Power 5.2/5.8GHz */ |
| 400 | #define SSB_SPROM8_MAXP_AH_MASK 0x00FF /* Mask for Max Power 5.8GHz */ | 401 | #define SSB_SPROM8_MAXP_AH_MASK 0x00FF /* Mask for Max Power 5.8GHz */ |
| 401 | #define SSB_SPROM8_MAXP_AL_MASK 0xFF00 /* Mask for Max Power 5.2GHz */ | 402 | #define SSB_SPROM8_MAXP_AL_MASK 0xFF00 /* Mask for Max Power 5.2GHz */ |
| 402 | #define SSB_SPROM8_MAXP_AL_SHIFT 8 | 403 | #define SSB_SPROM8_MAXP_AL_SHIFT 8 |
| 403 | #define SSB_SPROM8_PA1B0 0x10CC /* 5.3GHz power amp settings */ | 404 | #define SSB_SPROM8_PA1B0 0x00CC /* 5.3GHz power amp settings */ |
| 404 | #define SSB_SPROM8_PA1B1 0x10CE | 405 | #define SSB_SPROM8_PA1B1 0x00CE |
| 405 | #define SSB_SPROM8_PA1B2 0x10D0 | 406 | #define SSB_SPROM8_PA1B2 0x00D0 |
| 406 | #define SSB_SPROM8_PA1LOB0 0x10D2 /* 5.2GHz power amp settings */ | 407 | #define SSB_SPROM8_PA1LOB0 0x00D2 /* 5.2GHz power amp settings */ |
| 407 | #define SSB_SPROM8_PA1LOB1 0x10D4 | 408 | #define SSB_SPROM8_PA1LOB1 0x00D4 |
| 408 | #define SSB_SPROM8_PA1LOB2 0x10D6 | 409 | #define SSB_SPROM8_PA1LOB2 0x00D6 |
| 409 | #define SSB_SPROM8_PA1HIB0 0x10D8 /* 5.8GHz power amp settings */ | 410 | #define SSB_SPROM8_PA1HIB0 0x00D8 /* 5.8GHz power amp settings */ |
| 410 | #define SSB_SPROM8_PA1HIB1 0x10DA | 411 | #define SSB_SPROM8_PA1HIB1 0x00DA |
| 411 | #define SSB_SPROM8_PA1HIB2 0x10DC | 412 | #define SSB_SPROM8_PA1HIB2 0x00DC |
| 412 | #define SSB_SPROM8_CCK2GPO 0x1140 /* CCK power offset */ | 413 | #define SSB_SPROM8_CCK2GPO 0x0140 /* CCK power offset */ |
| 413 | #define SSB_SPROM8_OFDM2GPO 0x1142 /* 2.4GHz OFDM power offset */ | 414 | #define SSB_SPROM8_OFDM2GPO 0x0142 /* 2.4GHz OFDM power offset */ |
| 414 | #define SSB_SPROM8_OFDM5GPO 0x1146 /* 5.3GHz OFDM power offset */ | 415 | #define SSB_SPROM8_OFDM5GPO 0x0146 /* 5.3GHz OFDM power offset */ |
| 415 | #define SSB_SPROM8_OFDM5GLPO 0x114A /* 5.2GHz OFDM power offset */ | 416 | #define SSB_SPROM8_OFDM5GLPO 0x014A /* 5.2GHz OFDM power offset */ |
| 416 | #define SSB_SPROM8_OFDM5GHPO 0x114E /* 5.8GHz OFDM power offset */ | 417 | #define SSB_SPROM8_OFDM5GHPO 0x014E /* 5.8GHz OFDM power offset */ |
| 417 | 418 | ||
| 418 | /* Values for SSB_SPROM1_BINF_CCODE */ | 419 | /* Values for SSB_SPROM1_BINF_CCODE */ |
| 419 | enum { | 420 | enum { |
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index 32bfd1a8a48d..632ff7c03280 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h | |||
| @@ -33,6 +33,7 @@ struct plat_stmmacenet_data { | |||
| 33 | int bus_id; | 33 | int bus_id; |
| 34 | int pbl; | 34 | int pbl; |
| 35 | int has_gmac; | 35 | int has_gmac; |
| 36 | int enh_desc; | ||
| 36 | void (*fix_mac_speed)(void *priv, unsigned int speed); | 37 | void (*fix_mac_speed)(void *priv, unsigned int speed); |
| 37 | void (*bus_setup)(unsigned long ioaddr); | 38 | void (*bus_setup)(unsigned long ioaddr); |
| 38 | #ifdef CONFIG_STM_DRIVERS | 39 | #ifdef CONFIG_STM_DRIVERS |
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index f66014c90c9f..7bb5cb64f3b8 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
| @@ -980,6 +980,8 @@ extern int proc_doulongvec_minmax(struct ctl_table *, int, | |||
| 980 | void __user *, size_t *, loff_t *); | 980 | void __user *, size_t *, loff_t *); |
| 981 | extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int, | 981 | extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int, |
| 982 | void __user *, size_t *, loff_t *); | 982 | void __user *, size_t *, loff_t *); |
| 983 | extern int proc_do_large_bitmap(struct ctl_table *, int, | ||
| 984 | void __user *, size_t *, loff_t *); | ||
| 983 | 985 | ||
| 984 | /* | 986 | /* |
| 985 | * Register a set of sysctl names by calling register_sysctl_table | 987 | * Register a set of sysctl names by calling register_sysctl_table |
diff --git a/include/linux/tipc.h b/include/linux/tipc.h index 3d92396639de..181c8d0e6f73 100644 --- a/include/linux/tipc.h +++ b/include/linux/tipc.h | |||
| @@ -107,7 +107,7 @@ static inline unsigned int tipc_node(__u32 addr) | |||
| 107 | * Message importance levels | 107 | * Message importance levels |
| 108 | */ | 108 | */ |
| 109 | 109 | ||
| 110 | #define TIPC_LOW_IMPORTANCE 0 /* default */ | 110 | #define TIPC_LOW_IMPORTANCE 0 |
| 111 | #define TIPC_MEDIUM_IMPORTANCE 1 | 111 | #define TIPC_MEDIUM_IMPORTANCE 1 |
| 112 | #define TIPC_HIGH_IMPORTANCE 2 | 112 | #define TIPC_HIGH_IMPORTANCE 2 |
| 113 | #define TIPC_CRITICAL_IMPORTANCE 3 | 113 | #define TIPC_CRITICAL_IMPORTANCE 3 |
| @@ -127,23 +127,17 @@ static inline unsigned int tipc_node(__u32 addr) | |||
| 127 | * TIPC topology subscription service definitions | 127 | * TIPC topology subscription service definitions |
| 128 | */ | 128 | */ |
| 129 | 129 | ||
| 130 | #define TIPC_SUB_PORTS 0x01 /* filter for port availability */ | 130 | #define TIPC_SUB_SERVICE 0x00 /* Filter for service availability */ |
| 131 | #define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ | 131 | #define TIPC_SUB_PORTS 0x01 /* Filter for port availability */ |
| 132 | #define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ | 132 | #define TIPC_SUB_CANCEL 0x04 /* Cancel a subscription */ |
| 133 | #if 0 | ||
| 134 | /* The following filter options are not currently implemented */ | ||
| 135 | #define TIPC_SUB_NO_BIND_EVTS 0x04 /* filter out "publish" events */ | ||
| 136 | #define TIPC_SUB_NO_UNBIND_EVTS 0x08 /* filter out "withdraw" events */ | ||
| 137 | #define TIPC_SUB_SINGLE_EVT 0x10 /* expire after first event */ | ||
| 138 | #endif | ||
| 139 | 133 | ||
| 140 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ | 134 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ |
| 141 | 135 | ||
| 142 | struct tipc_subscr { | 136 | struct tipc_subscr { |
| 143 | struct tipc_name_seq seq; /* name sequence of interest */ | 137 | struct tipc_name_seq seq; /* NBO. Name sequence of interest */ |
| 144 | __u32 timeout; /* subscription duration (in ms) */ | 138 | __u32 timeout; /* NBO. Subscription duration (in ms) */ |
| 145 | __u32 filter; /* bitmask of filter options */ | 139 | __u32 filter; /* NBO. Bitmask of filter options */ |
| 146 | char usr_handle[8]; /* available for subscriber use */ | 140 | char usr_handle[8]; /* Opaque. Available for subscriber use */ |
| 147 | }; | 141 | }; |
| 148 | 142 | ||
| 149 | #define TIPC_PUBLISHED 1 /* publication event */ | 143 | #define TIPC_PUBLISHED 1 /* publication event */ |
| @@ -151,11 +145,11 @@ struct tipc_subscr { | |||
| 151 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ | 145 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ |
| 152 | 146 | ||
| 153 | struct tipc_event { | 147 | struct tipc_event { |
| 154 | __u32 event; /* event type */ | 148 | __u32 event; /* NBO. Event type, as defined above */ |
| 155 | __u32 found_lower; /* matching name seq instances */ | 149 | __u32 found_lower; /* NBO. Matching name seq instances */ |
| 156 | __u32 found_upper; /* " " " " */ | 150 | __u32 found_upper; /* " " " " " */ |
| 157 | struct tipc_portid port; /* associated port */ | 151 | struct tipc_portid port; /* NBO. Associated port */ |
| 158 | struct tipc_subscr s; /* associated subscription */ | 152 | struct tipc_subscr s; /* Original, associated subscription */ |
| 159 | }; | 153 | }; |
| 160 | 154 | ||
| 161 | /* | 155 | /* |
| @@ -188,7 +182,7 @@ struct sockaddr_tipc { | |||
| 188 | struct tipc_name_seq nameseq; | 182 | struct tipc_name_seq nameseq; |
| 189 | struct { | 183 | struct { |
| 190 | struct tipc_name name; | 184 | struct tipc_name name; |
| 191 | __u32 domain; /* 0: own zone */ | 185 | __u32 domain; |
| 192 | } name; | 186 | } name; |
| 193 | } addr; | 187 | } addr; |
| 194 | }; | 188 | }; |
| @@ -206,7 +200,7 @@ struct sockaddr_tipc { | |||
| 206 | */ | 200 | */ |
| 207 | 201 | ||
| 208 | #define TIPC_IMPORTANCE 127 /* Default: TIPC_LOW_IMPORTANCE */ | 202 | #define TIPC_IMPORTANCE 127 /* Default: TIPC_LOW_IMPORTANCE */ |
| 209 | #define TIPC_SRC_DROPPABLE 128 /* Default: 0 (resend congested msg) */ | 203 | #define TIPC_SRC_DROPPABLE 128 /* Default: based on socket type */ |
| 210 | #define TIPC_DEST_DROPPABLE 129 /* Default: based on socket type */ | 204 | #define TIPC_DEST_DROPPABLE 129 /* Default: based on socket type */ |
| 211 | #define TIPC_CONN_TIMEOUT 130 /* Default: 8000 (ms) */ | 205 | #define TIPC_CONN_TIMEOUT 130 /* Default: 8000 (ms) */ |
| 212 | #define TIPC_NODE_RECVQ_DEPTH 131 /* Default: none (read only) */ | 206 | #define TIPC_NODE_RECVQ_DEPTH 131 /* Default: none (read only) */ |
diff --git a/include/linux/tipc_config.h b/include/linux/tipc_config.h index 2bc6fa4adeb5..9cde86c32412 100644 --- a/include/linux/tipc_config.h +++ b/include/linux/tipc_config.h | |||
| @@ -74,6 +74,7 @@ | |||
| 74 | #define TIPC_CMD_SHOW_NAME_TABLE 0x0005 /* tx name_tbl_query, rx ultra_string */ | 74 | #define TIPC_CMD_SHOW_NAME_TABLE 0x0005 /* tx name_tbl_query, rx ultra_string */ |
| 75 | #define TIPC_CMD_SHOW_PORTS 0x0006 /* tx none, rx ultra_string */ | 75 | #define TIPC_CMD_SHOW_PORTS 0x0006 /* tx none, rx ultra_string */ |
| 76 | #define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */ | 76 | #define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */ |
| 77 | #define TIPC_CMD_SHOW_STATS 0x000F /* tx unsigned, rx ultra_string */ | ||
| 77 | 78 | ||
| 78 | #if 0 | 79 | #if 0 |
| 79 | #define TIPC_CMD_SHOW_PORT_STATS 0x0008 /* tx port_ref, rx ultra_string */ | 80 | #define TIPC_CMD_SHOW_PORT_STATS 0x0008 /* tx port_ref, rx ultra_string */ |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 4409967db0c4..bb44fa9ae135 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | */ | 23 | */ |
| 24 | #define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */ | 24 | #define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */ |
| 25 | #define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */ | 25 | #define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */ |
| 26 | #define NR_LDISCS 20 | 26 | #define NR_LDISCS 21 |
| 27 | 27 | ||
| 28 | /* line disciplines */ | 28 | /* line disciplines */ |
| 29 | #define N_TTY 0 | 29 | #define N_TTY 0 |
| @@ -46,8 +46,8 @@ | |||
| 46 | #define N_GIGASET_M101 16 /* Siemens Gigaset M101 serial DECT adapter */ | 46 | #define N_GIGASET_M101 16 /* Siemens Gigaset M101 serial DECT adapter */ |
| 47 | #define N_SLCAN 17 /* Serial / USB serial CAN Adaptors */ | 47 | #define N_SLCAN 17 /* Serial / USB serial CAN Adaptors */ |
| 48 | #define N_PPS 18 /* Pulse per Second */ | 48 | #define N_PPS 18 /* Pulse per Second */ |
| 49 | |||
| 50 | #define N_V253 19 /* Codec control over voice modem */ | 49 | #define N_V253 19 /* Codec control over voice modem */ |
| 50 | #define N_CAIF 20 /* CAIF protocol for talking to modems */ | ||
| 51 | 51 | ||
| 52 | /* | 52 | /* |
| 53 | * This character is the same as _POSIX_VDISABLE: it cannot be used as | 53 | * This character is the same as _POSIX_VDISABLE: it cannot be used as |
diff --git a/include/linux/wireless.h b/include/linux/wireless.h index 5b4c6c772a9b..e6827eedf18b 100644 --- a/include/linux/wireless.h +++ b/include/linux/wireless.h | |||
| @@ -346,6 +346,8 @@ | |||
| 346 | #define SIOCIWFIRST 0x8B00 | 346 | #define SIOCIWFIRST 0x8B00 |
| 347 | #define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ | 347 | #define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ |
| 348 | #define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) | 348 | #define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) |
| 349 | #define IW_HANDLER(id, func) \ | ||
| 350 | [IW_IOCTL_IDX(id)] = func | ||
| 349 | 351 | ||
| 350 | /* Odd : get (world access), even : set (root access) */ | 352 | /* Odd : get (world access), even : set (root access) */ |
| 351 | #define IW_IS_SET(cmd) (!((cmd) & 0x1)) | 353 | #define IW_IS_SET(cmd) (!((cmd) & 0x1)) |
| @@ -648,7 +650,7 @@ | |||
| 648 | * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ | 650 | * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ |
| 649 | #define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \ | 651 | #define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \ |
| 650 | (cmd - SIOCIWFIRSTPRIV + 0x60) : \ | 652 | (cmd - SIOCIWFIRSTPRIV + 0x60) : \ |
| 651 | (cmd - SIOCSIWCOMMIT)) | 653 | (cmd - SIOCIWFIRST)) |
| 652 | #define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5) | 654 | #define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5) |
| 653 | #define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) | 655 | #define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) |
| 654 | /* Event capability constants - event autogenerated by the kernel | 656 | /* Event capability constants - event autogenerated by the kernel |
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 1614d78c60ed..20725e213aee 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
| @@ -30,7 +30,7 @@ struct unix_skb_parms { | |||
| 30 | #endif | 30 | #endif |
| 31 | }; | 31 | }; |
| 32 | 32 | ||
| 33 | #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) | 33 | #define UNIXCB(skb) (*(struct unix_skb_parms *)&((skb)->cb)) |
| 34 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) | 34 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) |
| 35 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) | 35 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) |
| 36 | 36 | ||
| @@ -45,21 +45,23 @@ struct unix_skb_parms { | |||
| 45 | struct unix_sock { | 45 | struct unix_sock { |
| 46 | /* WARNING: sk has to be the first member */ | 46 | /* WARNING: sk has to be the first member */ |
| 47 | struct sock sk; | 47 | struct sock sk; |
| 48 | struct unix_address *addr; | 48 | struct unix_address *addr; |
| 49 | struct dentry *dentry; | 49 | struct dentry *dentry; |
| 50 | struct vfsmount *mnt; | 50 | struct vfsmount *mnt; |
| 51 | struct mutex readlock; | 51 | struct mutex readlock; |
| 52 | struct sock *peer; | 52 | struct sock *peer; |
| 53 | struct sock *other; | 53 | struct sock *other; |
| 54 | struct list_head link; | 54 | struct list_head link; |
| 55 | atomic_long_t inflight; | 55 | atomic_long_t inflight; |
| 56 | spinlock_t lock; | 56 | spinlock_t lock; |
| 57 | unsigned int gc_candidate : 1; | 57 | unsigned int gc_candidate : 1; |
| 58 | unsigned int gc_maybe_cycle : 1; | 58 | unsigned int gc_maybe_cycle : 1; |
| 59 | wait_queue_head_t peer_wait; | 59 | struct socket_wq peer_wq; |
| 60 | }; | 60 | }; |
| 61 | #define unix_sk(__sk) ((struct unix_sock *)__sk) | 61 | #define unix_sk(__sk) ((struct unix_sock *)__sk) |
| 62 | 62 | ||
| 63 | #define peer_wait peer_wq.wait | ||
| 64 | |||
| 63 | #ifdef CONFIG_SYSCTL | 65 | #ifdef CONFIG_SYSCTL |
| 64 | extern int unix_sysctl_register(struct net *net); | 66 | extern int unix_sysctl_register(struct net *net); |
| 65 | extern void unix_sysctl_unregister(struct net *net); | 67 | extern void unix_sysctl_unregister(struct net *net); |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index ce3c99e5fa25..e42f6ed5421c 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -107,6 +107,8 @@ struct hci_dev { | |||
| 107 | unsigned long acl_last_tx; | 107 | unsigned long acl_last_tx; |
| 108 | unsigned long sco_last_tx; | 108 | unsigned long sco_last_tx; |
| 109 | 109 | ||
| 110 | struct workqueue_struct *workqueue; | ||
| 111 | |||
| 110 | struct tasklet_struct cmd_task; | 112 | struct tasklet_struct cmd_task; |
| 111 | struct tasklet_struct rx_task; | 113 | struct tasklet_struct rx_task; |
| 112 | struct tasklet_struct tx_task; | 114 | struct tasklet_struct tx_task; |
| @@ -636,8 +638,8 @@ int hci_register_notifier(struct notifier_block *nb); | |||
| 636 | int hci_unregister_notifier(struct notifier_block *nb); | 638 | int hci_unregister_notifier(struct notifier_block *nb); |
| 637 | 639 | ||
| 638 | int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param); | 640 | int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param); |
| 639 | int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags); | 641 | void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags); |
| 640 | int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb); | 642 | void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb); |
| 641 | 643 | ||
| 642 | void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode); | 644 | void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode); |
| 643 | 645 | ||
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 17a689f27a6a..7c695bfd853c 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
| @@ -30,11 +30,12 @@ | |||
| 30 | #define L2CAP_DEFAULT_MIN_MTU 48 | 30 | #define L2CAP_DEFAULT_MIN_MTU 48 |
| 31 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff | 31 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff |
| 32 | #define L2CAP_DEFAULT_TX_WINDOW 63 | 32 | #define L2CAP_DEFAULT_TX_WINDOW 63 |
| 33 | #define L2CAP_DEFAULT_NUM_TO_ACK (L2CAP_DEFAULT_TX_WINDOW/5) | ||
| 34 | #define L2CAP_DEFAULT_MAX_TX 3 | 33 | #define L2CAP_DEFAULT_MAX_TX 3 |
| 35 | #define L2CAP_DEFAULT_RETRANS_TO 1000 /* 1 second */ | 34 | #define L2CAP_DEFAULT_RETRANS_TO 1000 /* 1 second */ |
| 36 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ | 35 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ |
| 37 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 672 | 36 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 672 |
| 37 | #define L2CAP_DEFAULT_ACK_TO 200 | ||
| 38 | #define L2CAP_LOCAL_BUSY_TRIES 12 | ||
| 38 | 39 | ||
| 39 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ | 40 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ |
| 40 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ | 41 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ |
| @@ -55,6 +56,8 @@ struct l2cap_options { | |||
| 55 | __u16 flush_to; | 56 | __u16 flush_to; |
| 56 | __u8 mode; | 57 | __u8 mode; |
| 57 | __u8 fcs; | 58 | __u8 fcs; |
| 59 | __u8 max_tx; | ||
| 60 | __u16 txwin_size; | ||
| 58 | }; | 61 | }; |
| 59 | 62 | ||
| 60 | #define L2CAP_CONNINFO 0x02 | 63 | #define L2CAP_CONNINFO 0x02 |
| @@ -292,6 +295,7 @@ struct l2cap_conn { | |||
| 292 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 295 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
| 293 | #define TX_QUEUE(sk) (&l2cap_pi(sk)->tx_queue) | 296 | #define TX_QUEUE(sk) (&l2cap_pi(sk)->tx_queue) |
| 294 | #define SREJ_QUEUE(sk) (&l2cap_pi(sk)->srej_queue) | 297 | #define SREJ_QUEUE(sk) (&l2cap_pi(sk)->srej_queue) |
| 298 | #define BUSY_QUEUE(sk) (&l2cap_pi(sk)->busy_queue) | ||
| 295 | #define SREJ_LIST(sk) (&l2cap_pi(sk)->srej_l.list) | 299 | #define SREJ_LIST(sk) (&l2cap_pi(sk)->srej_l.list) |
| 296 | 300 | ||
| 297 | struct srej_list { | 301 | struct srej_list { |
| @@ -320,7 +324,7 @@ struct l2cap_pinfo { | |||
| 320 | __u8 conf_req[64]; | 324 | __u8 conf_req[64]; |
| 321 | __u8 conf_len; | 325 | __u8 conf_len; |
| 322 | __u8 conf_state; | 326 | __u8 conf_state; |
| 323 | __u8 conn_state; | 327 | __u16 conn_state; |
| 324 | 328 | ||
| 325 | __u8 next_tx_seq; | 329 | __u8 next_tx_seq; |
| 326 | __u8 expected_ack_seq; | 330 | __u8 expected_ack_seq; |
| @@ -328,27 +332,35 @@ struct l2cap_pinfo { | |||
| 328 | __u8 buffer_seq; | 332 | __u8 buffer_seq; |
| 329 | __u8 buffer_seq_srej; | 333 | __u8 buffer_seq_srej; |
| 330 | __u8 srej_save_reqseq; | 334 | __u8 srej_save_reqseq; |
| 335 | __u8 frames_sent; | ||
| 331 | __u8 unacked_frames; | 336 | __u8 unacked_frames; |
| 332 | __u8 retry_count; | 337 | __u8 retry_count; |
| 333 | __u8 num_to_ack; | 338 | __u8 num_acked; |
| 334 | __u16 sdu_len; | 339 | __u16 sdu_len; |
| 335 | __u16 partial_sdu_len; | 340 | __u16 partial_sdu_len; |
| 336 | struct sk_buff *sdu; | 341 | struct sk_buff *sdu; |
| 337 | 342 | ||
| 338 | __u8 ident; | 343 | __u8 ident; |
| 339 | 344 | ||
| 345 | __u8 tx_win; | ||
| 346 | __u8 max_tx; | ||
| 340 | __u8 remote_tx_win; | 347 | __u8 remote_tx_win; |
| 341 | __u8 remote_max_tx; | 348 | __u8 remote_max_tx; |
| 342 | __u16 retrans_timeout; | 349 | __u16 retrans_timeout; |
| 343 | __u16 monitor_timeout; | 350 | __u16 monitor_timeout; |
| 344 | __u16 max_pdu_size; | 351 | __u16 remote_mps; |
| 352 | __u16 mps; | ||
| 345 | 353 | ||
| 346 | __le16 sport; | 354 | __le16 sport; |
| 347 | 355 | ||
| 356 | spinlock_t send_lock; | ||
| 348 | struct timer_list retrans_timer; | 357 | struct timer_list retrans_timer; |
| 349 | struct timer_list monitor_timer; | 358 | struct timer_list monitor_timer; |
| 359 | struct timer_list ack_timer; | ||
| 350 | struct sk_buff_head tx_queue; | 360 | struct sk_buff_head tx_queue; |
| 351 | struct sk_buff_head srej_queue; | 361 | struct sk_buff_head srej_queue; |
| 362 | struct sk_buff_head busy_queue; | ||
| 363 | struct work_struct busy_work; | ||
| 352 | struct srej_list srej_l; | 364 | struct srej_list srej_l; |
| 353 | struct l2cap_conn *conn; | 365 | struct l2cap_conn *conn; |
| 354 | struct sock *next_c; | 366 | struct sock *next_c; |
| @@ -367,19 +379,24 @@ struct l2cap_pinfo { | |||
| 367 | #define L2CAP_CONF_MAX_CONF_REQ 2 | 379 | #define L2CAP_CONF_MAX_CONF_REQ 2 |
| 368 | #define L2CAP_CONF_MAX_CONF_RSP 2 | 380 | #define L2CAP_CONF_MAX_CONF_RSP 2 |
| 369 | 381 | ||
| 370 | #define L2CAP_CONN_SAR_SDU 0x01 | 382 | #define L2CAP_CONN_SAR_SDU 0x0001 |
| 371 | #define L2CAP_CONN_SREJ_SENT 0x02 | 383 | #define L2CAP_CONN_SREJ_SENT 0x0002 |
| 372 | #define L2CAP_CONN_WAIT_F 0x04 | 384 | #define L2CAP_CONN_WAIT_F 0x0004 |
| 373 | #define L2CAP_CONN_SREJ_ACT 0x08 | 385 | #define L2CAP_CONN_SREJ_ACT 0x0008 |
| 374 | #define L2CAP_CONN_SEND_PBIT 0x10 | 386 | #define L2CAP_CONN_SEND_PBIT 0x0010 |
| 375 | #define L2CAP_CONN_REMOTE_BUSY 0x20 | 387 | #define L2CAP_CONN_REMOTE_BUSY 0x0020 |
| 376 | #define L2CAP_CONN_LOCAL_BUSY 0x40 | 388 | #define L2CAP_CONN_LOCAL_BUSY 0x0040 |
| 377 | #define L2CAP_CONN_REJ_ACT 0x80 | 389 | #define L2CAP_CONN_REJ_ACT 0x0080 |
| 390 | #define L2CAP_CONN_SEND_FBIT 0x0100 | ||
| 391 | #define L2CAP_CONN_RNR_SENT 0x0200 | ||
| 392 | #define L2CAP_CONN_SAR_RETRY 0x0400 | ||
| 378 | 393 | ||
| 379 | #define __mod_retrans_timer() mod_timer(&l2cap_pi(sk)->retrans_timer, \ | 394 | #define __mod_retrans_timer() mod_timer(&l2cap_pi(sk)->retrans_timer, \ |
| 380 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO)); | 395 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO)); |
| 381 | #define __mod_monitor_timer() mod_timer(&l2cap_pi(sk)->monitor_timer, \ | 396 | #define __mod_monitor_timer() mod_timer(&l2cap_pi(sk)->monitor_timer, \ |
| 382 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_MONITOR_TO)); | 397 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_MONITOR_TO)); |
| 398 | #define __mod_ack_timer() mod_timer(&l2cap_pi(sk)->ack_timer, \ | ||
| 399 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); | ||
| 383 | 400 | ||
| 384 | static inline int l2cap_tx_window_full(struct sock *sk) | 401 | static inline int l2cap_tx_window_full(struct sock *sk) |
| 385 | { | 402 | { |
diff --git a/include/net/caif/caif_dev.h b/include/net/caif/caif_dev.h new file mode 100644 index 000000000000..318ab9478a44 --- /dev/null +++ b/include/net/caif/caif_dev.h | |||
| @@ -0,0 +1,103 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/ sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CAIF_DEV_H_ | ||
| 8 | #define CAIF_DEV_H_ | ||
| 9 | |||
| 10 | #include <net/caif/caif_layer.h> | ||
| 11 | #include <net/caif/cfcnfg.h> | ||
| 12 | #include <linux/caif/caif_socket.h> | ||
| 13 | #include <linux/if.h> | ||
| 14 | |||
| 15 | /** | ||
| 16 | * struct caif_param - CAIF parameters. | ||
| 17 | * @size: Length of data | ||
| 18 | * @data: Binary Data Blob | ||
| 19 | */ | ||
| 20 | struct caif_param { | ||
| 21 | u16 size; | ||
| 22 | u8 data[256]; | ||
| 23 | }; | ||
| 24 | |||
| 25 | /** | ||
| 26 | * struct caif_connect_request - Request data for CAIF channel setup. | ||
| 27 | * @protocol: Type of CAIF protocol to use (at, datagram etc) | ||
| 28 | * @sockaddr: Socket address to connect. | ||
| 29 | * @priority: Priority of the connection. | ||
| 30 | * @link_selector: Link selector (high bandwidth or low latency) | ||
| 31 | * @link_name: Name of the CAIF Link Layer to use. | ||
| 32 | * @param: Connect Request parameters (CAIF_SO_REQ_PARAM). | ||
| 33 | * | ||
| 34 | * This struct is used when connecting a CAIF channel. | ||
| 35 | * It contains all CAIF channel configuration options. | ||
| 36 | */ | ||
| 37 | struct caif_connect_request { | ||
| 38 | enum caif_protocol_type protocol; | ||
| 39 | struct sockaddr_caif sockaddr; | ||
| 40 | enum caif_channel_priority priority; | ||
| 41 | enum caif_link_selector link_selector; | ||
| 42 | char link_name[16]; | ||
| 43 | struct caif_param param; | ||
| 44 | }; | ||
| 45 | |||
| 46 | /** | ||
| 47 | * caif_connect_client - Connect a client to CAIF Core Stack. | ||
| 48 | * @config: Channel setup parameters, specifying what address | ||
| 49 | * to connect on the Modem. | ||
| 50 | * @client_layer: User implementation of client layer. This layer | ||
| 51 | * MUST have receive and control callback functions | ||
| 52 | * implemented. | ||
| 53 | * | ||
| 54 | * This function connects a CAIF channel. The Client must implement | ||
| 55 | * the struct cflayer. This layer represents the Client layer and holds | ||
| 56 | * receive functions and control callback functions. Control callback | ||
| 57 | * function will receive information about connect/disconnect responses, | ||
| 58 | * flow control etc (see enum caif_control). | ||
| 59 | * E.g. CAIF Socket will call this function for each socket it connects | ||
| 60 | * and have one client_layer instance for each socket. | ||
| 61 | */ | ||
| 62 | int caif_connect_client(struct caif_connect_request *config, | ||
| 63 | struct cflayer *client_layer); | ||
| 64 | |||
| 65 | /** | ||
| 66 | * caif_disconnect_client - Disconnects a client from the CAIF stack. | ||
| 67 | * | ||
| 68 | * @client_layer: Client layer to be removed. | ||
| 69 | */ | ||
| 70 | int caif_disconnect_client(struct cflayer *client_layer); | ||
| 71 | |||
| 72 | /** | ||
| 73 | * caif_release_client - Release adaptation layer reference to client. | ||
| 74 | * | ||
| 75 | * @client_layer: Client layer. | ||
| 76 | * | ||
| 77 | * Releases a client/adaptation layer use of the caif stack. | ||
| 78 | * This function must be used after caif_disconnect_client to | ||
| 79 | * decrease the reference count of the service layer. | ||
| 80 | */ | ||
| 81 | void caif_release_client(struct cflayer *client_layer); | ||
| 82 | |||
| 83 | /** | ||
| 84 | * connect_req_to_link_param - Translate configuration parameters | ||
| 85 | * from socket format to internal format. | ||
| 86 | * @cnfg: Pointer to configuration handler | ||
| 87 | * @con_req: Configuration parameters supplied in function | ||
| 88 | * caif_connect_client | ||
| 89 | * @channel_setup_param: Parameters supplied to the CAIF Core stack for | ||
| 90 | * setting up channels. | ||
| 91 | * | ||
| 92 | */ | ||
| 93 | int connect_req_to_link_param(struct cfcnfg *cnfg, | ||
| 94 | struct caif_connect_request *con_req, | ||
| 95 | struct cfctrl_link_param *channel_setup_param); | ||
| 96 | |||
| 97 | /** | ||
| 98 | * get_caif_conf() - Get the configuration handler. | ||
| 99 | */ | ||
| 100 | struct cfcnfg *get_caif_conf(void); | ||
| 101 | |||
| 102 | |||
| 103 | #endif /* CAIF_DEV_H_ */ | ||
diff --git a/include/net/caif/caif_device.h b/include/net/caif/caif_device.h new file mode 100644 index 000000000000..d02f044adb8a --- /dev/null +++ b/include/net/caif/caif_device.h | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/ sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CAIF_DEVICE_H_ | ||
| 8 | #define CAIF_DEVICE_H_ | ||
| 9 | #include <linux/kernel.h> | ||
| 10 | #include <linux/net.h> | ||
| 11 | #include <linux/netdevice.h> | ||
| 12 | #include <linux/caif/caif_socket.h> | ||
| 13 | #include <net/caif/caif_device.h> | ||
| 14 | |||
| 15 | /** | ||
| 16 | * struct caif_dev_common - data shared between CAIF drivers and stack. | ||
| 17 | * @flowctrl: Flow Control callback function. This function is | ||
| 18 | * supplied by CAIF Core Stack and is used by CAIF | ||
| 19 | * Link Layer to send flow-stop to CAIF Core. | ||
| 20 | * The flow information will be distributed to all | ||
| 21 | * clients of CAIF. | ||
| 22 | * | ||
| 23 | * @link_select: Profile of device, either high-bandwidth or | ||
| 24 | * low-latency. This member is set by CAIF Link | ||
| 25 | * Layer Device in order to indicate if this device | ||
| 26 | * is a high bandwidth or low latency device. | ||
| 27 | * | ||
| 28 | * @use_frag: CAIF Frames may be fragmented. | ||
| 29 | * Is set by CAIF Link Layer in order to indicate if the | ||
| 30 | * interface receives fragmented frames that must be | ||
| 31 | * assembled by CAIF Core Layer. | ||
| 32 | * | ||
| 33 | * @use_fcs: Indicate if Frame CheckSum (fcs) is used. | ||
| 34 | * Is set if the physical interface is | ||
| 35 | * using Frame Checksum on the CAIF Frames. | ||
| 36 | * | ||
| 37 | * @use_stx: Indicate STart of frame eXtension (stx) in use. | ||
| 38 | * Is set if the CAIF Link Layer expects | ||
| 39 | * CAIF Frames to start with the STX byte. | ||
| 40 | * | ||
| 41 | * This structure is shared between the CAIF drivers and the CAIF stack. | ||
| 42 | * It is used by the device to register its behavior. | ||
| 43 | * CAIF Core layer must set the member flowctrl in order to supply | ||
| 44 | * CAIF Link Layer with the flow control function. | ||
| 45 | * | ||
| 46 | */ | ||
| 47 | struct caif_dev_common { | ||
| 48 | void (*flowctrl)(struct net_device *net, int on); | ||
| 49 | enum caif_link_selector link_select; | ||
| 50 | int use_frag; | ||
| 51 | int use_fcs; | ||
| 52 | int use_stx; | ||
| 53 | }; | ||
| 54 | |||
| 55 | #endif /* CAIF_DEVICE_H_ */ | ||
diff --git a/include/net/caif/caif_layer.h b/include/net/caif/caif_layer.h new file mode 100644 index 000000000000..25c472f0e5b8 --- /dev/null +++ b/include/net/caif/caif_layer.h | |||
| @@ -0,0 +1,283 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland / sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CAIF_LAYER_H_ | ||
| 8 | #define CAIF_LAYER_H_ | ||
| 9 | |||
| 10 | #include <linux/list.h> | ||
| 11 | |||
| 12 | struct cflayer; | ||
| 13 | struct cfpkt; | ||
| 14 | struct cfpktq; | ||
| 15 | struct caif_payload_info; | ||
| 16 | struct caif_packet_funcs; | ||
| 17 | |||
| 18 | #define CAIF_MAX_FRAMESIZE 4096 | ||
| 19 | #define CAIF_MAX_PAYLOAD_SIZE (4096 - 64) | ||
| 20 | #define CAIF_NEEDED_HEADROOM (10) | ||
| 21 | #define CAIF_NEEDED_TAILROOM (2) | ||
| 22 | |||
| 23 | #define CAIF_LAYER_NAME_SZ 16 | ||
| 24 | #define CAIF_SUCCESS 1 | ||
| 25 | #define CAIF_FAILURE 0 | ||
| 26 | |||
| 27 | /** | ||
| 28 | * caif_assert() - Assert function for CAIF. | ||
| 29 | * @assert: expression to evaluate. | ||
| 30 | * | ||
| 31 | * This function will print a error message and a do WARN_ON if the | ||
| 32 | * assertion failes. Normally this will do a stack up at the current location. | ||
| 33 | */ | ||
| 34 | #define caif_assert(assert) \ | ||
| 35 | do { \ | ||
| 36 | if (!(assert)) { \ | ||
| 37 | pr_err("caif:Assert detected:'%s'\n", #assert); \ | ||
| 38 | WARN_ON(!(assert)); \ | ||
| 39 | } \ | ||
| 40 | } while (0) | ||
| 41 | |||
| 42 | |||
| 43 | /** | ||
| 44 | * enum caif_ctrlcmd - CAIF Stack Control Signaling sent in layer.ctrlcmd(). | ||
| 45 | * | ||
| 46 | * @CAIF_CTRLCMD_FLOW_OFF_IND: Flow Control is OFF, transmit function | ||
| 47 | * should stop sending data | ||
| 48 | * | ||
| 49 | * @CAIF_CTRLCMD_FLOW_ON_IND: Flow Control is ON, transmit function | ||
| 50 | * can start sending data | ||
| 51 | * | ||
| 52 | * @CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND: Remote end modem has decided to close | ||
| 53 | * down channel | ||
| 54 | * | ||
| 55 | * @CAIF_CTRLCMD_INIT_RSP: Called initially when the layer below | ||
| 56 | * has finished initialization | ||
| 57 | * | ||
| 58 | * @CAIF_CTRLCMD_DEINIT_RSP: Called when de-initialization is | ||
| 59 | * complete | ||
| 60 | * | ||
| 61 | * @CAIF_CTRLCMD_INIT_FAIL_RSP: Called if initialization fails | ||
| 62 | * | ||
| 63 | * @_CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND: CAIF Link layer temporarily cannot | ||
| 64 | * send more packets. | ||
| 65 | * @_CAIF_CTRLCMD_PHYIF_FLOW_ON_IND: Called if CAIF Link layer is able | ||
| 66 | * to send packets again. | ||
| 67 | * @_CAIF_CTRLCMD_PHYIF_DOWN_IND: Called if CAIF Link layer is going | ||
| 68 | * down. | ||
| 69 | * | ||
| 70 | * These commands are sent upwards in the CAIF stack to the CAIF Client. | ||
| 71 | * They are used for signaling originating from the modem or CAIF Link Layer. | ||
| 72 | * These are either responses (*_RSP) or events (*_IND). | ||
| 73 | */ | ||
| 74 | enum caif_ctrlcmd { | ||
| 75 | CAIF_CTRLCMD_FLOW_OFF_IND, | ||
| 76 | CAIF_CTRLCMD_FLOW_ON_IND, | ||
| 77 | CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND, | ||
| 78 | CAIF_CTRLCMD_INIT_RSP, | ||
| 79 | CAIF_CTRLCMD_DEINIT_RSP, | ||
| 80 | CAIF_CTRLCMD_INIT_FAIL_RSP, | ||
| 81 | _CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND, | ||
| 82 | _CAIF_CTRLCMD_PHYIF_FLOW_ON_IND, | ||
| 83 | _CAIF_CTRLCMD_PHYIF_DOWN_IND, | ||
| 84 | }; | ||
| 85 | |||
| 86 | /** | ||
| 87 | * enum caif_modemcmd - Modem Control Signaling, sent from CAIF Client | ||
| 88 | * to the CAIF Link Layer or modem. | ||
| 89 | * | ||
| 90 | * @CAIF_MODEMCMD_FLOW_ON_REQ: Flow Control is ON, transmit function | ||
| 91 | * can start sending data. | ||
| 92 | * | ||
| 93 | * @CAIF_MODEMCMD_FLOW_OFF_REQ: Flow Control is OFF, transmit function | ||
| 94 | * should stop sending data. | ||
| 95 | * | ||
| 96 | * @_CAIF_MODEMCMD_PHYIF_USEFULL: Notify physical layer that it is in use | ||
| 97 | * | ||
| 98 | * @_CAIF_MODEMCMD_PHYIF_USELESS: Notify physical layer that it is | ||
| 99 | * no longer in use. | ||
| 100 | * | ||
| 101 | * These are requests sent 'downwards' in the stack. | ||
| 102 | * Flow ON, OFF can be indicated to the modem. | ||
| 103 | */ | ||
| 104 | enum caif_modemcmd { | ||
| 105 | CAIF_MODEMCMD_FLOW_ON_REQ = 0, | ||
| 106 | CAIF_MODEMCMD_FLOW_OFF_REQ = 1, | ||
| 107 | _CAIF_MODEMCMD_PHYIF_USEFULL = 3, | ||
| 108 | _CAIF_MODEMCMD_PHYIF_USELESS = 4 | ||
| 109 | }; | ||
| 110 | |||
| 111 | /** | ||
| 112 | * enum caif_direction - CAIF Packet Direction. | ||
| 113 | * Indicate if a packet is to be sent out or to be received in. | ||
| 114 | * @CAIF_DIR_IN: Incoming packet received. | ||
| 115 | * @CAIF_DIR_OUT: Outgoing packet to be transmitted. | ||
| 116 | */ | ||
| 117 | enum caif_direction { | ||
| 118 | CAIF_DIR_IN = 0, | ||
| 119 | CAIF_DIR_OUT = 1 | ||
| 120 | }; | ||
| 121 | |||
| 122 | /** | ||
| 123 | * struct cflayer - CAIF Stack layer. | ||
| 124 | * Defines the framework for the CAIF Core Stack. | ||
| 125 | * @up: Pointer up to the layer above. | ||
| 126 | * @dn: Pointer down to the layer below. | ||
| 127 | * @node: List node used when layer participate in a list. | ||
| 128 | * @receive: Packet receive function. | ||
| 129 | * @transmit: Packet transmit funciton. | ||
| 130 | * @ctrlcmd: Used for control signalling upwards in the stack. | ||
| 131 | * @modemcmd: Used for control signaling downwards in the stack. | ||
| 132 | * @prio: Priority of this layer. | ||
| 133 | * @id: The identity of this layer | ||
| 134 | * @type: The type of this layer | ||
| 135 | * @name: Name of the layer. | ||
| 136 | * | ||
| 137 | * This structure defines the layered structure in CAIF. | ||
| 138 | * | ||
| 139 | * It defines CAIF layering structure, used by all CAIF Layers and the | ||
| 140 | * layers interfacing CAIF. | ||
| 141 | * | ||
| 142 | * In order to integrate with CAIF an adaptation layer on top of the CAIF stack | ||
| 143 | * and PHY layer below the CAIF stack | ||
| 144 | * must be implemented. These layer must follow the design principles below. | ||
| 145 | * | ||
| 146 | * Principles for layering of protocol layers: | ||
| 147 | * - All layers must use this structure. If embedding it, then place this | ||
| 148 | * structure first in the layer specific structure. | ||
| 149 | * | ||
| 150 | * - Each layer should not depend on any others layer private data. | ||
| 151 | * | ||
| 152 | * - In order to send data upwards do | ||
| 153 | * layer->up->receive(layer->up, packet); | ||
| 154 | * | ||
| 155 | * - In order to send data downwards do | ||
| 156 | * layer->dn->transmit(layer->dn, info, packet); | ||
| 157 | */ | ||
| 158 | struct cflayer { | ||
| 159 | struct cflayer *up; | ||
| 160 | struct cflayer *dn; | ||
| 161 | struct list_head node; | ||
| 162 | |||
| 163 | /* | ||
| 164 | * receive() - Receive Function. | ||
| 165 | * Contract: Each layer must implement a receive function passing the | ||
| 166 | * CAIF packets upwards in the stack. | ||
| 167 | * Packet handling rules: | ||
| 168 | * - The CAIF packet (cfpkt) cannot be accessed after | ||
| 169 | * passing it to the next layer using up->receive(). | ||
| 170 | * - If parsing of the packet fails, the packet must be | ||
| 171 | * destroyed and -1 returned from the function. | ||
| 172 | * - If parsing succeeds (and above layers return OK) then | ||
| 173 | * the function must return a value > 0. | ||
| 174 | * | ||
| 175 | * Returns result < 0 indicates an error, 0 or positive value | ||
| 176 | * indicates success. | ||
| 177 | * | ||
| 178 | * @layr: Pointer to the current layer the receive function is | ||
| 179 | * implemented for (this pointer). | ||
| 180 | * @cfpkt: Pointer to CaifPacket to be handled. | ||
| 181 | */ | ||
| 182 | int (*receive)(struct cflayer *layr, struct cfpkt *cfpkt); | ||
| 183 | |||
| 184 | /* | ||
| 185 | * transmit() - Transmit Function. | ||
| 186 | * Contract: Each layer must implement a transmit function passing the | ||
| 187 | * CAIF packet downwards in the stack. | ||
| 188 | * Packet handling rules: | ||
| 189 | * - The CAIF packet (cfpkt) ownership is passed to the | ||
| 190 | * transmit function. This means that the the packet | ||
| 191 | * cannot be accessed after passing it to the below | ||
| 192 | * layer using dn->transmit(). | ||
| 193 | * | ||
| 194 | * - If transmit fails, however, the ownership is returned | ||
| 195 | * to thecaller. The caller of "dn->transmit()" must | ||
| 196 | * destroy or resend packet. | ||
| 197 | * | ||
| 198 | * - Return value less than zero means error, zero or | ||
| 199 | * greater than zero means OK. | ||
| 200 | * | ||
| 201 | * result < 0 indicates an error, 0 or positive value | ||
| 202 | * indicate success. | ||
| 203 | * | ||
| 204 | * @layr: Pointer to the current layer the receive function | ||
| 205 | * isimplemented for (this pointer). | ||
| 206 | * @cfpkt: Pointer to CaifPacket to be handled. | ||
| 207 | */ | ||
| 208 | int (*transmit) (struct cflayer *layr, struct cfpkt *cfpkt); | ||
| 209 | |||
| 210 | /* | ||
| 211 | * cttrlcmd() - Control Function upwards in CAIF Stack. | ||
| 212 | * Used for signaling responses (CAIF_CTRLCMD_*_RSP) | ||
| 213 | * and asynchronous events from the modem (CAIF_CTRLCMD_*_IND) | ||
| 214 | * | ||
| 215 | * @layr: Pointer to the current layer the receive function | ||
| 216 | * is implemented for (this pointer). | ||
| 217 | * @ctrl: Control Command. | ||
| 218 | */ | ||
| 219 | void (*ctrlcmd) (struct cflayer *layr, enum caif_ctrlcmd ctrl, | ||
| 220 | int phyid); | ||
| 221 | |||
| 222 | /* | ||
| 223 | * modemctrl() - Control Function used for controlling the modem. | ||
| 224 | * Used to signal down-wards in the CAIF stack. | ||
| 225 | * Returns 0 on success, < 0 upon failure. | ||
| 226 | * | ||
| 227 | * @layr: Pointer to the current layer the receive function | ||
| 228 | * is implemented for (this pointer). | ||
| 229 | * @ctrl: Control Command. | ||
| 230 | */ | ||
| 231 | int (*modemcmd) (struct cflayer *layr, enum caif_modemcmd ctrl); | ||
| 232 | |||
| 233 | unsigned short prio; | ||
| 234 | unsigned int id; | ||
| 235 | unsigned int type; | ||
| 236 | char name[CAIF_LAYER_NAME_SZ]; | ||
| 237 | }; | ||
| 238 | |||
| 239 | /** | ||
| 240 | * layer_set_up() - Set the up pointer for a specified layer. | ||
| 241 | * @layr: Layer where up pointer shall be set. | ||
| 242 | * @above: Layer above. | ||
| 243 | */ | ||
| 244 | #define layer_set_up(layr, above) ((layr)->up = (struct cflayer *)(above)) | ||
| 245 | |||
| 246 | /** | ||
| 247 | * layer_set_dn() - Set the down pointer for a specified layer. | ||
| 248 | * @layr: Layer where down pointer shall be set. | ||
| 249 | * @below: Layer below. | ||
| 250 | */ | ||
| 251 | #define layer_set_dn(layr, below) ((layr)->dn = (struct cflayer *)(below)) | ||
| 252 | |||
| 253 | /** | ||
| 254 | * struct dev_info - Physical Device info information about physical layer. | ||
| 255 | * @dev: Pointer to native physical device. | ||
| 256 | * @id: Physical ID of the physical connection used by the | ||
| 257 | * logical CAIF connection. Used by service layers to | ||
| 258 | * identify their physical id to Caif MUX (CFMUXL)so | ||
| 259 | * that the MUX can add the correct physical ID to the | ||
| 260 | * packet. | ||
| 261 | */ | ||
| 262 | struct dev_info { | ||
| 263 | void *dev; | ||
| 264 | unsigned int id; | ||
| 265 | }; | ||
| 266 | |||
| 267 | /** | ||
| 268 | * struct caif_payload_info - Payload information embedded in packet (sk_buff). | ||
| 269 | * | ||
| 270 | * @dev_info: Information about the receiving device. | ||
| 271 | * | ||
| 272 | * @hdr_len: Header length, used to align pay load on 32bit boundary. | ||
| 273 | * | ||
| 274 | * @channel_id: Channel ID of the logical CAIF connection. | ||
| 275 | * Used by mux to insert channel id into the caif packet. | ||
| 276 | */ | ||
| 277 | struct caif_payload_info { | ||
| 278 | struct dev_info *dev_info; | ||
| 279 | unsigned short hdr_len; | ||
| 280 | unsigned short channel_id; | ||
| 281 | }; | ||
| 282 | |||
| 283 | #endif /* CAIF_LAYER_H_ */ | ||
diff --git a/include/net/caif/cfcnfg.h b/include/net/caif/cfcnfg.h new file mode 100644 index 000000000000..9fc2fc20b884 --- /dev/null +++ b/include/net/caif/cfcnfg.h | |||
| @@ -0,0 +1,140 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFCNFG_H_ | ||
| 8 | #define CFCNFG_H_ | ||
| 9 | #include <linux/spinlock.h> | ||
| 10 | #include <net/caif/caif_layer.h> | ||
| 11 | #include <net/caif/cfctrl.h> | ||
| 12 | |||
| 13 | struct cfcnfg; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * enum cfcnfg_phy_type - Types of physical layers defined in CAIF Stack | ||
| 17 | * | ||
| 18 | * @CFPHYTYPE_FRAG: Fragmented frames physical interface. | ||
| 19 | * @CFPHYTYPE_CAIF: Generic CAIF physical interface | ||
| 20 | */ | ||
| 21 | enum cfcnfg_phy_type { | ||
| 22 | CFPHYTYPE_FRAG = 1, | ||
| 23 | CFPHYTYPE_CAIF, | ||
| 24 | CFPHYTYPE_MAX | ||
| 25 | }; | ||
| 26 | |||
| 27 | /** | ||
| 28 | * enum cfcnfg_phy_preference - Physical preference HW Abstraction | ||
| 29 | * | ||
| 30 | * @CFPHYPREF_UNSPECIFIED: Default physical interface | ||
| 31 | * | ||
| 32 | * @CFPHYPREF_LOW_LAT: Default physical interface for low-latency | ||
| 33 | * traffic | ||
| 34 | * @CFPHYPREF_HIGH_BW: Default physical interface for high-bandwidth | ||
| 35 | * traffic | ||
| 36 | * @CFPHYPREF_LOOP: TEST only Loopback interface simulating modem | ||
| 37 | * responses. | ||
| 38 | * | ||
| 39 | */ | ||
| 40 | enum cfcnfg_phy_preference { | ||
| 41 | CFPHYPREF_UNSPECIFIED, | ||
| 42 | CFPHYPREF_LOW_LAT, | ||
| 43 | CFPHYPREF_HIGH_BW, | ||
| 44 | CFPHYPREF_LOOP | ||
| 45 | }; | ||
| 46 | |||
| 47 | /** | ||
| 48 | * cfcnfg_create() - Create the CAIF configuration object. | ||
| 49 | */ | ||
| 50 | struct cfcnfg *cfcnfg_create(void); | ||
| 51 | |||
| 52 | /** | ||
| 53 | * cfcnfg_remove() - Remove the CFCNFG object | ||
| 54 | * @cfg: config object | ||
| 55 | */ | ||
| 56 | void cfcnfg_remove(struct cfcnfg *cfg); | ||
| 57 | |||
| 58 | /** | ||
| 59 | * cfcnfg_add_phy_layer() - Adds a physical layer to the CAIF stack. | ||
| 60 | * @cnfg: Pointer to a CAIF configuration object, created by | ||
| 61 | * cfcnfg_create(). | ||
| 62 | * @phy_type: Specifies the type of physical interface, e.g. | ||
| 63 | * CFPHYTYPE_FRAG. | ||
| 64 | * @dev: Pointer to link layer device | ||
| 65 | * @phy_layer: Specify the physical layer. The transmit function | ||
| 66 | * MUST be set in the structure. | ||
| 67 | * @phyid: The assigned physical ID for this layer, used in | ||
| 68 | * cfcnfg_add_adapt_layer to specify PHY for the link. | ||
| 69 | * @pref: The phy (link layer) preference. | ||
| 70 | * @fcs: Specify if checksum is used in CAIF Framing Layer. | ||
| 71 | * @stx: Specify if Start Of Frame eXtention is used. | ||
| 72 | */ | ||
| 73 | |||
| 74 | void | ||
| 75 | cfcnfg_add_phy_layer(struct cfcnfg *cnfg, enum cfcnfg_phy_type phy_type, | ||
| 76 | void *dev, struct cflayer *phy_layer, u16 *phyid, | ||
| 77 | enum cfcnfg_phy_preference pref, | ||
| 78 | bool fcs, bool stx); | ||
| 79 | |||
| 80 | /** | ||
| 81 | * cfcnfg_del_phy_layer - Deletes an phy layer from the CAIF stack. | ||
| 82 | * | ||
| 83 | * @cnfg: Pointer to a CAIF configuration object, created by | ||
| 84 | * cfcnfg_create(). | ||
| 85 | * @phy_layer: Adaptation layer to be removed. | ||
| 86 | */ | ||
| 87 | int cfcnfg_del_phy_layer(struct cfcnfg *cnfg, struct cflayer *phy_layer); | ||
| 88 | |||
| 89 | /** | ||
| 90 | * cfcnfg_disconn_adapt_layer - Disconnects an adaptation layer. | ||
| 91 | * | ||
| 92 | * @cnfg: Pointer to a CAIF configuration object, created by | ||
| 93 | * cfcnfg_create(). | ||
| 94 | * @adap_layer: Adaptation layer to be removed. | ||
| 95 | */ | ||
| 96 | int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, | ||
| 97 | struct cflayer *adap_layer); | ||
| 98 | |||
| 99 | /** | ||
| 100 | * cfcnfg_release_adap_layer - Used by client to release the adaptation layer. | ||
| 101 | * | ||
| 102 | * @adap_layer: Adaptation layer. | ||
| 103 | */ | ||
| 104 | void cfcnfg_release_adap_layer(struct cflayer *adap_layer); | ||
| 105 | |||
| 106 | /** | ||
| 107 | * cfcnfg_add_adaptation_layer - Add an adaptation layer to the CAIF stack. | ||
| 108 | * | ||
| 109 | * The adaptation Layer is where the interface to application or higher-level | ||
| 110 | * driver functionality is implemented. | ||
| 111 | * | ||
| 112 | * @cnfg: Pointer to a CAIF configuration object, created by | ||
| 113 | * cfcnfg_create(). | ||
| 114 | * @param: Link setup parameters. | ||
| 115 | * @adap_layer: Specify the adaptation layer; the receive and | ||
| 116 | * flow-control functions MUST be set in the structure. | ||
| 117 | * | ||
| 118 | */ | ||
| 119 | int cfcnfg_add_adaptation_layer(struct cfcnfg *cnfg, | ||
| 120 | struct cfctrl_link_param *param, | ||
| 121 | struct cflayer *adap_layer); | ||
| 122 | |||
| 123 | /** | ||
| 124 | * cfcnfg_get_phyid() - Get physical ID, given type. | ||
| 125 | * Returns one of the physical interfaces matching the given type. | ||
| 126 | * Zero if no match is found. | ||
| 127 | * @cnfg: Configuration object | ||
| 128 | * @phy_pref: Caif Link Layer preference | ||
| 129 | */ | ||
| 130 | struct dev_info *cfcnfg_get_phyid(struct cfcnfg *cnfg, | ||
| 131 | enum cfcnfg_phy_preference phy_pref); | ||
| 132 | |||
| 133 | /** | ||
| 134 | * cfcnfg_get_named() - Get the Physical Identifier of CAIF Link Layer | ||
| 135 | * @cnfg: Configuration object | ||
| 136 | * @name: Name of the Physical Layer (Caif Link Layer) | ||
| 137 | */ | ||
| 138 | int cfcnfg_get_named(struct cfcnfg *cnfg, char *name); | ||
| 139 | |||
| 140 | #endif /* CFCNFG_H_ */ | ||
diff --git a/include/net/caif/cfctrl.h b/include/net/caif/cfctrl.h new file mode 100644 index 000000000000..997603f2bf4c --- /dev/null +++ b/include/net/caif/cfctrl.h | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFCTRL_H_ | ||
| 8 | #define CFCTRL_H_ | ||
| 9 | #include <net/caif/caif_layer.h> | ||
| 10 | #include <net/caif/cfsrvl.h> | ||
| 11 | |||
| 12 | /* CAIF Control packet commands */ | ||
| 13 | enum cfctrl_cmd { | ||
| 14 | CFCTRL_CMD_LINK_SETUP = 0, | ||
| 15 | CFCTRL_CMD_LINK_DESTROY = 1, | ||
| 16 | CFCTRL_CMD_LINK_ERR = 2, | ||
| 17 | CFCTRL_CMD_ENUM = 3, | ||
| 18 | CFCTRL_CMD_SLEEP = 4, | ||
| 19 | CFCTRL_CMD_WAKE = 5, | ||
| 20 | CFCTRL_CMD_LINK_RECONF = 6, | ||
| 21 | CFCTRL_CMD_START_REASON = 7, | ||
| 22 | CFCTRL_CMD_RADIO_SET = 8, | ||
| 23 | CFCTRL_CMD_MODEM_SET = 9, | ||
| 24 | CFCTRL_CMD_MASK = 0xf | ||
| 25 | }; | ||
| 26 | |||
| 27 | /* Channel types */ | ||
| 28 | enum cfctrl_srv { | ||
| 29 | CFCTRL_SRV_DECM = 0, | ||
| 30 | CFCTRL_SRV_VEI = 1, | ||
| 31 | CFCTRL_SRV_VIDEO = 2, | ||
| 32 | CFCTRL_SRV_DBG = 3, | ||
| 33 | CFCTRL_SRV_DATAGRAM = 4, | ||
| 34 | CFCTRL_SRV_RFM = 5, | ||
| 35 | CFCTRL_SRV_UTIL = 6, | ||
| 36 | CFCTRL_SRV_MASK = 0xf | ||
| 37 | }; | ||
| 38 | |||
| 39 | #define CFCTRL_RSP_BIT 0x20 | ||
| 40 | #define CFCTRL_ERR_BIT 0x10 | ||
| 41 | |||
| 42 | struct cfctrl_rsp { | ||
| 43 | void (*linksetup_rsp)(struct cflayer *layer, u8 linkid, | ||
| 44 | enum cfctrl_srv serv, u8 phyid, | ||
| 45 | struct cflayer *adapt_layer); | ||
| 46 | void (*linkdestroy_rsp)(struct cflayer *layer, u8 linkid); | ||
| 47 | void (*linkerror_ind)(void); | ||
| 48 | void (*enum_rsp)(void); | ||
| 49 | void (*sleep_rsp)(void); | ||
| 50 | void (*wake_rsp)(void); | ||
| 51 | void (*restart_rsp)(void); | ||
| 52 | void (*radioset_rsp)(void); | ||
| 53 | void (*reject_rsp)(struct cflayer *layer, u8 linkid, | ||
| 54 | struct cflayer *client_layer);; | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* Link Setup Parameters for CAIF-Links. */ | ||
| 58 | struct cfctrl_link_param { | ||
| 59 | enum cfctrl_srv linktype;/* (T3,T0) Type of Channel */ | ||
| 60 | u8 priority; /* (P4,P0) Priority of the channel */ | ||
| 61 | u8 phyid; /* (U2-U0) Physical interface to connect */ | ||
| 62 | u8 endpoint; /* (E1,E0) Endpoint for data channels */ | ||
| 63 | u8 chtype; /* (H1,H0) Channel-Type, applies to | ||
| 64 | * VEI, DEBUG */ | ||
| 65 | union { | ||
| 66 | struct { | ||
| 67 | u8 connid; /* (D7,D0) Video LinkId */ | ||
| 68 | } video; | ||
| 69 | |||
| 70 | struct { | ||
| 71 | u32 connid; /* (N31,Ngit0) Connection ID used | ||
| 72 | * for Datagram */ | ||
| 73 | } datagram; | ||
| 74 | |||
| 75 | struct { | ||
| 76 | u32 connid; /* Connection ID used for RFM */ | ||
| 77 | char volume[20]; /* Volume to mount for RFM */ | ||
| 78 | } rfm; /* Configuration for RFM */ | ||
| 79 | |||
| 80 | struct { | ||
| 81 | u16 fifosize_kb; /* Psock FIFO size in KB */ | ||
| 82 | u16 fifosize_bufs; /* Psock # signal buffers */ | ||
| 83 | char name[16]; /* Name of the PSOCK service */ | ||
| 84 | u8 params[255]; /* Link setup Parameters> */ | ||
| 85 | u16 paramlen; /* Length of Link Setup | ||
| 86 | * Parameters */ | ||
| 87 | } utility; /* Configuration for Utility Links (Psock) */ | ||
| 88 | } u; | ||
| 89 | }; | ||
| 90 | |||
| 91 | /* This structure is used internally in CFCTRL */ | ||
| 92 | struct cfctrl_request_info { | ||
| 93 | int sequence_no; | ||
| 94 | enum cfctrl_cmd cmd; | ||
| 95 | u8 channel_id; | ||
| 96 | struct cfctrl_link_param param; | ||
| 97 | struct cfctrl_request_info *next; | ||
| 98 | struct cflayer *client_layer; | ||
| 99 | }; | ||
| 100 | |||
| 101 | struct cfctrl { | ||
| 102 | struct cfsrvl serv; | ||
| 103 | struct cfctrl_rsp res; | ||
| 104 | atomic_t req_seq_no; | ||
| 105 | atomic_t rsp_seq_no; | ||
| 106 | struct cfctrl_request_info *first_req; | ||
| 107 | /* Protects from simultaneous access to first_req list */ | ||
| 108 | spinlock_t info_list_lock; | ||
| 109 | #ifndef CAIF_NO_LOOP | ||
| 110 | u8 loop_linkid; | ||
| 111 | int loop_linkused[256]; | ||
| 112 | /* Protects simultaneous access to loop_linkid and loop_linkused */ | ||
| 113 | spinlock_t loop_linkid_lock; | ||
| 114 | #endif | ||
| 115 | |||
| 116 | }; | ||
| 117 | |||
| 118 | void cfctrl_enum_req(struct cflayer *cfctrl, u8 physlinkid); | ||
| 119 | int cfctrl_linkup_request(struct cflayer *cfctrl, | ||
| 120 | struct cfctrl_link_param *param, | ||
| 121 | struct cflayer *user_layer); | ||
| 122 | int cfctrl_linkdown_req(struct cflayer *cfctrl, u8 linkid, | ||
| 123 | struct cflayer *client); | ||
| 124 | void cfctrl_sleep_req(struct cflayer *cfctrl); | ||
| 125 | void cfctrl_wake_req(struct cflayer *cfctrl); | ||
| 126 | void cfctrl_getstartreason_req(struct cflayer *cfctrl); | ||
| 127 | struct cflayer *cfctrl_create(void); | ||
| 128 | void cfctrl_set_dnlayer(struct cflayer *this, struct cflayer *dn); | ||
| 129 | void cfctrl_set_uplayer(struct cflayer *this, struct cflayer *up); | ||
| 130 | struct cfctrl_rsp *cfctrl_get_respfuncs(struct cflayer *layer); | ||
| 131 | bool cfctrl_req_eq(struct cfctrl_request_info *r1, | ||
| 132 | struct cfctrl_request_info *r2); | ||
| 133 | void cfctrl_insert_req(struct cfctrl *ctrl, | ||
| 134 | struct cfctrl_request_info *req); | ||
| 135 | struct cfctrl_request_info *cfctrl_remove_req(struct cfctrl *ctrl, | ||
| 136 | struct cfctrl_request_info *req); | ||
| 137 | void cfctrl_cancel_req(struct cflayer *layr, struct cflayer *adap_layer); | ||
| 138 | |||
| 139 | #endif /* CFCTRL_H_ */ | ||
diff --git a/include/net/caif/cffrml.h b/include/net/caif/cffrml.h new file mode 100644 index 000000000000..3f14d2e1ce61 --- /dev/null +++ b/include/net/caif/cffrml.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFFRML_H_ | ||
| 8 | #define CFFRML_H_ | ||
| 9 | #include <net/caif/caif_layer.h> | ||
| 10 | |||
| 11 | struct cffrml; | ||
| 12 | struct cflayer *cffrml_create(u16 phyid, bool DoFCS); | ||
| 13 | void cffrml_set_uplayer(struct cflayer *this, struct cflayer *up); | ||
| 14 | void cffrml_set_dnlayer(struct cflayer *this, struct cflayer *dn); | ||
| 15 | |||
| 16 | #endif /* CFFRML_H_ */ | ||
diff --git a/include/net/caif/cfmuxl.h b/include/net/caif/cfmuxl.h new file mode 100644 index 000000000000..4e1b4f33423e --- /dev/null +++ b/include/net/caif/cfmuxl.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFMUXL_H_ | ||
| 8 | #define CFMUXL_H_ | ||
| 9 | #include <net/caif/caif_layer.h> | ||
| 10 | |||
| 11 | struct cfsrvl; | ||
| 12 | struct cffrml; | ||
| 13 | |||
| 14 | struct cflayer *cfmuxl_create(void); | ||
| 15 | int cfmuxl_set_uplayer(struct cflayer *layr, struct cflayer *up, u8 linkid); | ||
| 16 | struct cflayer *cfmuxl_remove_dnlayer(struct cflayer *layr, u8 phyid); | ||
| 17 | int cfmuxl_set_dnlayer(struct cflayer *layr, struct cflayer *up, u8 phyid); | ||
| 18 | struct cflayer *cfmuxl_remove_uplayer(struct cflayer *layr, u8 linkid); | ||
| 19 | bool cfmuxl_is_phy_inuse(struct cflayer *layr, u8 phyid); | ||
| 20 | u8 cfmuxl_get_phyid(struct cflayer *layr, u8 channel_id); | ||
| 21 | |||
| 22 | #endif /* CFMUXL_H_ */ | ||
diff --git a/include/net/caif/cfpkt.h b/include/net/caif/cfpkt.h new file mode 100644 index 000000000000..fbc681beff52 --- /dev/null +++ b/include/net/caif/cfpkt.h | |||
| @@ -0,0 +1,274 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFPKT_H_ | ||
| 8 | #define CFPKT_H_ | ||
| 9 | #include <net/caif/caif_layer.h> | ||
| 10 | #include <linux/types.h> | ||
| 11 | struct cfpkt; | ||
| 12 | |||
| 13 | /* Create a CAIF packet. | ||
| 14 | * len: Length of packet to be created | ||
| 15 | * @return New packet. | ||
| 16 | */ | ||
| 17 | struct cfpkt *cfpkt_create(u16 len); | ||
| 18 | |||
| 19 | /* Create a CAIF packet. | ||
| 20 | * data Data to copy. | ||
| 21 | * len Length of packet to be created | ||
| 22 | * @return New packet. | ||
| 23 | */ | ||
| 24 | struct cfpkt *cfpkt_create_uplink(const unsigned char *data, unsigned int len); | ||
| 25 | /* | ||
| 26 | * Destroy a CAIF Packet. | ||
| 27 | * pkt Packet to be destoyed. | ||
| 28 | */ | ||
| 29 | void cfpkt_destroy(struct cfpkt *pkt); | ||
| 30 | |||
| 31 | /* | ||
| 32 | * Extract header from packet. | ||
| 33 | * | ||
| 34 | * pkt Packet to extract header data from. | ||
| 35 | * data Pointer to copy the header data into. | ||
| 36 | * len Length of head data to copy. | ||
| 37 | * @return zero on success and error code upon failure | ||
| 38 | */ | ||
| 39 | int cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len); | ||
| 40 | |||
| 41 | /* | ||
| 42 | * Peek header from packet. | ||
| 43 | * Reads data from packet without changing packet. | ||
| 44 | * | ||
| 45 | * pkt Packet to extract header data from. | ||
| 46 | * data Pointer to copy the header data into. | ||
| 47 | * len Length of head data to copy. | ||
| 48 | * @return zero on success and error code upon failure | ||
| 49 | */ | ||
| 50 | int cfpkt_peek_head(struct cfpkt *pkt, void *data, u16 len); | ||
| 51 | |||
| 52 | /* | ||
| 53 | * Extract header from trailer (end of packet). | ||
| 54 | * | ||
| 55 | * pkt Packet to extract header data from. | ||
| 56 | * data Pointer to copy the trailer data into. | ||
| 57 | * len Length of header data to copy. | ||
| 58 | * @return zero on success and error code upon failure | ||
| 59 | */ | ||
| 60 | int cfpkt_extr_trail(struct cfpkt *pkt, void *data, u16 len); | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Add header to packet. | ||
| 64 | * | ||
| 65 | * | ||
| 66 | * pkt Packet to add header data to. | ||
| 67 | * data Pointer to data to copy into the header. | ||
| 68 | * len Length of header data to copy. | ||
| 69 | * @return zero on success and error code upon failure | ||
| 70 | */ | ||
| 71 | int cfpkt_add_head(struct cfpkt *pkt, const void *data, u16 len); | ||
| 72 | |||
| 73 | /* | ||
| 74 | * Add trailer to packet. | ||
| 75 | * | ||
| 76 | * | ||
| 77 | * pkt Packet to add trailer data to. | ||
| 78 | * data Pointer to data to copy into the trailer. | ||
| 79 | * len Length of trailer data to copy. | ||
| 80 | * @return zero on success and error code upon failure | ||
| 81 | */ | ||
| 82 | int cfpkt_add_trail(struct cfpkt *pkt, const void *data, u16 len); | ||
| 83 | |||
| 84 | /* | ||
| 85 | * Pad trailer on packet. | ||
| 86 | * Moves data pointer in packet, no content copied. | ||
| 87 | * | ||
| 88 | * pkt Packet in which to pad trailer. | ||
| 89 | * len Length of padding to add. | ||
| 90 | * @return zero on success and error code upon failure | ||
| 91 | */ | ||
| 92 | int cfpkt_pad_trail(struct cfpkt *pkt, u16 len); | ||
| 93 | |||
| 94 | /* | ||
| 95 | * Add a single byte to packet body (tail). | ||
| 96 | * | ||
| 97 | * pkt Packet in which to add byte. | ||
| 98 | * data Byte to add. | ||
| 99 | * @return zero on success and error code upon failure | ||
| 100 | */ | ||
| 101 | int cfpkt_addbdy(struct cfpkt *pkt, const u8 data); | ||
| 102 | |||
| 103 | /* | ||
| 104 | * Add a data to packet body (tail). | ||
| 105 | * | ||
| 106 | * pkt Packet in which to add data. | ||
| 107 | * data Pointer to data to copy into the packet body. | ||
| 108 | * len Length of data to add. | ||
| 109 | * @return zero on success and error code upon failure | ||
| 110 | */ | ||
| 111 | int cfpkt_add_body(struct cfpkt *pkt, const void *data, u16 len); | ||
| 112 | |||
| 113 | /* | ||
| 114 | * Checks whether there are more data to process in packet. | ||
| 115 | * pkt Packet to check. | ||
| 116 | * @return true if more data are available in packet false otherwise | ||
| 117 | */ | ||
| 118 | bool cfpkt_more(struct cfpkt *pkt); | ||
| 119 | |||
| 120 | /* | ||
| 121 | * Checks whether the packet is erroneous, | ||
| 122 | * i.e. if it has been attempted to extract more data than available in packet | ||
| 123 | * or writing more data than has been allocated in cfpkt_create(). | ||
| 124 | * pkt Packet to check. | ||
| 125 | * @return true on error false otherwise | ||
| 126 | */ | ||
| 127 | bool cfpkt_erroneous(struct cfpkt *pkt); | ||
| 128 | |||
| 129 | /* | ||
| 130 | * Get the packet length. | ||
| 131 | * pkt Packet to get length from. | ||
| 132 | * @return Number of bytes in packet. | ||
| 133 | */ | ||
| 134 | u16 cfpkt_getlen(struct cfpkt *pkt); | ||
| 135 | |||
| 136 | /* | ||
| 137 | * Set the packet length, by adjusting the trailer pointer according to length. | ||
| 138 | * pkt Packet to set length. | ||
| 139 | * len Packet length. | ||
| 140 | * @return Number of bytes in packet. | ||
| 141 | */ | ||
| 142 | int cfpkt_setlen(struct cfpkt *pkt, u16 len); | ||
| 143 | |||
| 144 | /* | ||
| 145 | * cfpkt_append - Appends a packet's data to another packet. | ||
| 146 | * dstpkt: Packet to append data into, WILL BE FREED BY THIS FUNCTION | ||
| 147 | * addpkt: Packet to be appended and automatically released, | ||
| 148 | * WILL BE FREED BY THIS FUNCTION. | ||
| 149 | * expectlen: Packet's expected total length. This should be considered | ||
| 150 | * as a hint. | ||
| 151 | * NB: Input packets will be destroyed after appending and cannot be used | ||
| 152 | * after calling this function. | ||
| 153 | * @return The new appended packet. | ||
| 154 | */ | ||
| 155 | struct cfpkt *cfpkt_append(struct cfpkt *dstpkt, struct cfpkt *addpkt, | ||
| 156 | u16 expectlen); | ||
| 157 | |||
| 158 | /* | ||
| 159 | * cfpkt_split - Split a packet into two packets at the specified split point. | ||
| 160 | * pkt: Packet to be split (will contain the first part of the data on exit) | ||
| 161 | * pos: Position to split packet in two parts. | ||
| 162 | * @return The new packet, containing the second part of the data. | ||
| 163 | */ | ||
| 164 | struct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos); | ||
| 165 | |||
| 166 | /* | ||
| 167 | * Iteration function, iterates the packet buffers from start to end. | ||
| 168 | * | ||
| 169 | * Checksum iteration function used to iterate buffers | ||
| 170 | * (we may have packets consisting of a chain of buffers) | ||
| 171 | * pkt: Packet to calculate checksum for | ||
| 172 | * iter_func: Function pointer to iteration function | ||
| 173 | * chks: Checksum calculated so far. | ||
| 174 | * buf: Pointer to the buffer to checksum | ||
| 175 | * len: Length of buf. | ||
| 176 | * data: Initial checksum value. | ||
| 177 | * @return Checksum of buffer. | ||
| 178 | */ | ||
| 179 | |||
| 180 | u16 cfpkt_iterate(struct cfpkt *pkt, | ||
| 181 | u16 (*iter_func)(u16 chks, void *buf, u16 len), | ||
| 182 | u16 data); | ||
| 183 | |||
| 184 | /* Append by giving user access to packet buffer | ||
| 185 | * cfpkt Packet to append to | ||
| 186 | * buf Buffer inside pkt that user shall copy data into | ||
| 187 | * buflen Length of buffer and number of bytes added to packet | ||
| 188 | * @return 0 on error, 1 on success | ||
| 189 | */ | ||
| 190 | int cfpkt_raw_append(struct cfpkt *cfpkt, void **buf, unsigned int buflen); | ||
| 191 | |||
| 192 | /* Extract by giving user access to packet buffer | ||
| 193 | * cfpkt Packet to extract from | ||
| 194 | * buf Buffer inside pkt that user shall copy data from | ||
| 195 | * buflen Length of buffer and number of bytes removed from packet | ||
| 196 | * @return 0 on error, 1 on success | ||
| 197 | */ | ||
| 198 | int cfpkt_raw_extract(struct cfpkt *cfpkt, void **buf, unsigned int buflen); | ||
| 199 | |||
| 200 | /* Map from a "native" packet (e.g. Linux Socket Buffer) to a CAIF packet. | ||
| 201 | * dir - Direction indicating whether this packet is to be sent or received. | ||
| 202 | * nativepkt - The native packet to be transformed to a CAIF packet | ||
| 203 | * @return The mapped CAIF Packet CFPKT. | ||
| 204 | */ | ||
| 205 | struct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt); | ||
| 206 | |||
| 207 | /* Map from a CAIF packet to a "native" packet (e.g. Linux Socket Buffer). | ||
| 208 | * pkt - The CAIF packet to be transformed into a "native" packet. | ||
| 209 | * @return The native packet transformed from a CAIF packet. | ||
| 210 | */ | ||
| 211 | void *cfpkt_tonative(struct cfpkt *pkt); | ||
| 212 | |||
| 213 | /* | ||
| 214 | * Insert a packet in the packet queue. | ||
| 215 | * pktq Packet queue to insert into | ||
| 216 | * pkt Packet to be inserted in queue | ||
| 217 | * prio Priority of packet | ||
| 218 | */ | ||
| 219 | void cfpkt_queue(struct cfpktq *pktq, struct cfpkt *pkt, | ||
| 220 | unsigned short prio); | ||
| 221 | |||
| 222 | /* | ||
| 223 | * Remove a packet from the packet queue. | ||
| 224 | * pktq Packet queue to fetch packets from. | ||
| 225 | * @return Dequeued packet. | ||
| 226 | */ | ||
| 227 | struct cfpkt *cfpkt_dequeue(struct cfpktq *pktq); | ||
| 228 | |||
| 229 | /* | ||
| 230 | * Peek into a packet from the packet queue. | ||
| 231 | * pktq Packet queue to fetch packets from. | ||
| 232 | * @return Peeked packet. | ||
| 233 | */ | ||
| 234 | struct cfpkt *cfpkt_qpeek(struct cfpktq *pktq); | ||
| 235 | |||
| 236 | /* | ||
| 237 | * Initiates the packet queue. | ||
| 238 | * @return Pointer to new packet queue. | ||
| 239 | */ | ||
| 240 | struct cfpktq *cfpktq_create(void); | ||
| 241 | |||
| 242 | /* | ||
| 243 | * Get the number of packets in the queue. | ||
| 244 | * pktq Packet queue to fetch count from. | ||
| 245 | * @return Number of packets in queue. | ||
| 246 | */ | ||
| 247 | int cfpkt_qcount(struct cfpktq *pktq); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * Put content of packet into buffer for debuging purposes. | ||
| 251 | * pkt Packet to copy data from | ||
| 252 | * buf Buffer to copy data into | ||
| 253 | * buflen Length of data to copy | ||
| 254 | * @return Pointer to copied data | ||
| 255 | */ | ||
| 256 | char *cfpkt_log_pkt(struct cfpkt *pkt, char *buf, int buflen); | ||
| 257 | |||
| 258 | /* | ||
| 259 | * Clones a packet and releases the original packet. | ||
| 260 | * This is used for taking ownership of a packet e.g queueing. | ||
| 261 | * pkt Packet to clone and release. | ||
| 262 | * @return Cloned packet. | ||
| 263 | */ | ||
| 264 | struct cfpkt *cfpkt_clone_release(struct cfpkt *pkt); | ||
| 265 | |||
| 266 | |||
| 267 | /* | ||
| 268 | * Returns packet information for a packet. | ||
| 269 | * pkt Packet to get info from; | ||
| 270 | * @return Packet information | ||
| 271 | */ | ||
| 272 | struct caif_payload_info *cfpkt_info(struct cfpkt *pkt); | ||
| 273 | /*! @} */ | ||
| 274 | #endif /* CFPKT_H_ */ | ||
diff --git a/include/net/caif/cfserl.h b/include/net/caif/cfserl.h new file mode 100644 index 000000000000..b8374321b362 --- /dev/null +++ b/include/net/caif/cfserl.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFSERL_H_ | ||
| 8 | #define CFSERL_H_ | ||
| 9 | #include <net/caif/caif_layer.h> | ||
| 10 | |||
| 11 | struct cflayer *cfserl_create(int type, int instance, bool use_stx); | ||
| 12 | #endif /* CFSERL_H_ */ | ||
diff --git a/include/net/caif/cfsrvl.h b/include/net/caif/cfsrvl.h new file mode 100644 index 000000000000..2dc9eb193ecf --- /dev/null +++ b/include/net/caif/cfsrvl.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson AB 2010 | ||
| 3 | * Author: Sjur Brendeland/sjur.brandeland@stericsson.com | ||
| 4 | * License terms: GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef CFSRVL_H_ | ||
| 8 | #define CFSRVL_H_ | ||
| 9 | #include <linux/list.h> | ||
| 10 | #include <linux/stddef.h> | ||
| 11 | #include <linux/types.h> | ||
| 12 | #include <linux/kref.h> | ||
| 13 | |||
| 14 | struct cfsrvl { | ||
| 15 | struct cflayer layer; | ||
| 16 | bool open; | ||
| 17 | bool phy_flow_on; | ||
| 18 | bool modem_flow_on; | ||
| 19 | struct dev_info dev_info; | ||
| 20 | struct kref ref; | ||
| 21 | }; | ||
| 22 | |||
| 23 | void cfsrvl_release(struct kref *kref); | ||
| 24 | struct cflayer *cfvei_create(u8 linkid, struct dev_info *dev_info); | ||
| 25 | struct cflayer *cfdgml_create(u8 linkid, struct dev_info *dev_info); | ||
| 26 | struct cflayer *cfutill_create(u8 linkid, struct dev_info *dev_info); | ||
| 27 | struct cflayer *cfvidl_create(u8 linkid, struct dev_info *dev_info); | ||
| 28 | struct cflayer *cfrfml_create(u8 linkid, struct dev_info *dev_info); | ||
| 29 | struct cflayer *cfdbgl_create(u8 linkid, struct dev_info *dev_info); | ||
| 30 | bool cfsrvl_phyid_match(struct cflayer *layer, int phyid); | ||
| 31 | void cfservl_destroy(struct cflayer *layer); | ||
| 32 | void cfsrvl_init(struct cfsrvl *service, | ||
| 33 | u8 channel_id, | ||
| 34 | struct dev_info *dev_info); | ||
| 35 | bool cfsrvl_ready(struct cfsrvl *service, int *err); | ||
| 36 | u8 cfsrvl_getphyid(struct cflayer *layer); | ||
| 37 | |||
| 38 | static inline void cfsrvl_get(struct cflayer *layr) | ||
| 39 | { | ||
| 40 | struct cfsrvl *s; | ||
| 41 | if (layr == NULL) | ||
| 42 | return; | ||
| 43 | s = container_of(layr, struct cfsrvl, layer); | ||
| 44 | kref_get(&s->ref); | ||
| 45 | } | ||
| 46 | |||
| 47 | static inline void cfsrvl_put(struct cflayer *layr) | ||
| 48 | { | ||
| 49 | struct cfsrvl *s; | ||
| 50 | if (layr == NULL) | ||
| 51 | return; | ||
| 52 | s = container_of(layr, struct cfsrvl, layer); | ||
| 53 | kref_put(&s->ref, cfsrvl_release); | ||
| 54 | } | ||
| 55 | |||
| 56 | #endif /* CFSRVL_H_ */ | ||
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 3d134a1fb96b..b44a2e5321a3 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -511,6 +511,7 @@ struct mpath_info { | |||
| 511 | * @basic_rates: basic rates in IEEE 802.11 format | 511 | * @basic_rates: basic rates in IEEE 802.11 format |
| 512 | * (or NULL for no change) | 512 | * (or NULL for no change) |
| 513 | * @basic_rates_len: number of basic rates | 513 | * @basic_rates_len: number of basic rates |
| 514 | * @ap_isolate: do not forward packets between connected stations | ||
| 514 | */ | 515 | */ |
| 515 | struct bss_parameters { | 516 | struct bss_parameters { |
| 516 | int use_cts_prot; | 517 | int use_cts_prot; |
| @@ -518,6 +519,7 @@ struct bss_parameters { | |||
| 518 | int use_short_slot_time; | 519 | int use_short_slot_time; |
| 519 | u8 *basic_rates; | 520 | u8 *basic_rates; |
| 520 | u8 basic_rates_len; | 521 | u8 basic_rates_len; |
| 522 | int ap_isolate; | ||
| 521 | }; | 523 | }; |
| 522 | 524 | ||
| 523 | struct mesh_config { | 525 | struct mesh_config { |
| @@ -704,6 +706,10 @@ struct cfg80211_crypto_settings { | |||
| 704 | * @key_len: length of WEP key for shared key authentication | 706 | * @key_len: length of WEP key for shared key authentication |
| 705 | * @key_idx: index of WEP key for shared key authentication | 707 | * @key_idx: index of WEP key for shared key authentication |
| 706 | * @key: WEP key for shared key authentication | 708 | * @key: WEP key for shared key authentication |
| 709 | * @local_state_change: This is a request for a local state only, i.e., no | ||
| 710 | * Authentication frame is to be transmitted and authentication state is | ||
| 711 | * to be changed without having to wait for a response from the peer STA | ||
| 712 | * (AP). | ||
| 707 | */ | 713 | */ |
| 708 | struct cfg80211_auth_request { | 714 | struct cfg80211_auth_request { |
| 709 | struct cfg80211_bss *bss; | 715 | struct cfg80211_bss *bss; |
| @@ -712,6 +718,7 @@ struct cfg80211_auth_request { | |||
| 712 | enum nl80211_auth_type auth_type; | 718 | enum nl80211_auth_type auth_type; |
| 713 | const u8 *key; | 719 | const u8 *key; |
| 714 | u8 key_len, key_idx; | 720 | u8 key_len, key_idx; |
| 721 | bool local_state_change; | ||
| 715 | }; | 722 | }; |
| 716 | 723 | ||
| 717 | /** | 724 | /** |
| @@ -744,12 +751,15 @@ struct cfg80211_assoc_request { | |||
| 744 | * @ie: Extra IEs to add to Deauthentication frame or %NULL | 751 | * @ie: Extra IEs to add to Deauthentication frame or %NULL |
| 745 | * @ie_len: Length of ie buffer in octets | 752 | * @ie_len: Length of ie buffer in octets |
| 746 | * @reason_code: The reason code for the deauthentication | 753 | * @reason_code: The reason code for the deauthentication |
| 754 | * @local_state_change: This is a request for a local state only, i.e., no | ||
| 755 | * Deauthentication frame is to be transmitted. | ||
| 747 | */ | 756 | */ |
| 748 | struct cfg80211_deauth_request { | 757 | struct cfg80211_deauth_request { |
| 749 | struct cfg80211_bss *bss; | 758 | struct cfg80211_bss *bss; |
| 750 | const u8 *ie; | 759 | const u8 *ie; |
| 751 | size_t ie_len; | 760 | size_t ie_len; |
| 752 | u16 reason_code; | 761 | u16 reason_code; |
| 762 | bool local_state_change; | ||
| 753 | }; | 763 | }; |
| 754 | 764 | ||
| 755 | /** | 765 | /** |
| @@ -762,12 +772,15 @@ struct cfg80211_deauth_request { | |||
| 762 | * @ie: Extra IEs to add to Disassociation frame or %NULL | 772 | * @ie: Extra IEs to add to Disassociation frame or %NULL |
| 763 | * @ie_len: Length of ie buffer in octets | 773 | * @ie_len: Length of ie buffer in octets |
| 764 | * @reason_code: The reason code for the disassociation | 774 | * @reason_code: The reason code for the disassociation |
| 775 | * @local_state_change: This is a request for a local state only, i.e., no | ||
| 776 | * Disassociation frame is to be transmitted. | ||
| 765 | */ | 777 | */ |
| 766 | struct cfg80211_disassoc_request { | 778 | struct cfg80211_disassoc_request { |
| 767 | struct cfg80211_bss *bss; | 779 | struct cfg80211_bss *bss; |
| 768 | const u8 *ie; | 780 | const u8 *ie; |
| 769 | size_t ie_len; | 781 | size_t ie_len; |
| 770 | u16 reason_code; | 782 | u16 reason_code; |
| 783 | bool local_state_change; | ||
| 771 | }; | 784 | }; |
| 772 | 785 | ||
| 773 | /** | 786 | /** |
| @@ -953,7 +966,11 @@ struct cfg80211_pmksa { | |||
| 953 | * | 966 | * |
| 954 | * @set_txq_params: Set TX queue parameters | 967 | * @set_txq_params: Set TX queue parameters |
| 955 | * | 968 | * |
| 956 | * @set_channel: Set channel | 969 | * @set_channel: Set channel for a given wireless interface. Some devices |
| 970 | * may support multi-channel operation (by channel hopping) so cfg80211 | ||
| 971 | * doesn't verify much. Note, however, that the passed netdev may be | ||
| 972 | * %NULL as well if the user requested changing the channel for the | ||
| 973 | * device itself, or for a monitor interface. | ||
| 957 | * | 974 | * |
| 958 | * @scan: Request to do a scan. If returning zero, the scan request is given | 975 | * @scan: Request to do a scan. If returning zero, the scan request is given |
| 959 | * the driver, and will be valid until passed to cfg80211_scan_done(). | 976 | * the driver, and will be valid until passed to cfg80211_scan_done(). |
| @@ -1007,6 +1024,9 @@ struct cfg80211_pmksa { | |||
| 1007 | * RSN IE. It allows for faster roaming between WPA2 BSSIDs. | 1024 | * RSN IE. It allows for faster roaming between WPA2 BSSIDs. |
| 1008 | * @del_pmksa: Delete a cached PMKID. | 1025 | * @del_pmksa: Delete a cached PMKID. |
| 1009 | * @flush_pmksa: Flush all cached PMKIDs. | 1026 | * @flush_pmksa: Flush all cached PMKIDs. |
| 1027 | * @set_power_mgmt: Configure WLAN power management. A timeout value of -1 | ||
| 1028 | * allows the driver to adjust the dynamic ps timeout value. | ||
| 1029 | * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold. | ||
| 1010 | * | 1030 | * |
| 1011 | */ | 1031 | */ |
| 1012 | struct cfg80211_ops { | 1032 | struct cfg80211_ops { |
| @@ -1079,7 +1099,7 @@ struct cfg80211_ops { | |||
| 1079 | int (*set_txq_params)(struct wiphy *wiphy, | 1099 | int (*set_txq_params)(struct wiphy *wiphy, |
| 1080 | struct ieee80211_txq_params *params); | 1100 | struct ieee80211_txq_params *params); |
| 1081 | 1101 | ||
| 1082 | int (*set_channel)(struct wiphy *wiphy, | 1102 | int (*set_channel)(struct wiphy *wiphy, struct net_device *dev, |
| 1083 | struct ieee80211_channel *chan, | 1103 | struct ieee80211_channel *chan, |
| 1084 | enum nl80211_channel_type channel_type); | 1104 | enum nl80211_channel_type channel_type); |
| 1085 | 1105 | ||
| @@ -1152,6 +1172,10 @@ struct cfg80211_ops { | |||
| 1152 | 1172 | ||
| 1153 | int (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev, | 1173 | int (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev, |
| 1154 | bool enabled, int timeout); | 1174 | bool enabled, int timeout); |
| 1175 | |||
| 1176 | int (*set_cqm_rssi_config)(struct wiphy *wiphy, | ||
| 1177 | struct net_device *dev, | ||
| 1178 | s32 rssi_thold, u32 rssi_hyst); | ||
| 1155 | }; | 1179 | }; |
| 1156 | 1180 | ||
| 1157 | /* | 1181 | /* |
| @@ -1441,6 +1465,8 @@ struct cfg80211_cached_keys; | |||
| 1441 | * @list: (private) Used to collect the interfaces | 1465 | * @list: (private) Used to collect the interfaces |
| 1442 | * @netdev: (private) Used to reference back to the netdev | 1466 | * @netdev: (private) Used to reference back to the netdev |
| 1443 | * @current_bss: (private) Used by the internal configuration code | 1467 | * @current_bss: (private) Used by the internal configuration code |
| 1468 | * @channel: (private) Used by the internal configuration code to track | ||
| 1469 | * user-set AP, monitor and WDS channels for wireless extensions | ||
| 1444 | * @bssid: (private) Used by the internal configuration code | 1470 | * @bssid: (private) Used by the internal configuration code |
| 1445 | * @ssid: (private) Used by the internal configuration code | 1471 | * @ssid: (private) Used by the internal configuration code |
| 1446 | * @ssid_len: (private) Used by the internal configuration code | 1472 | * @ssid_len: (private) Used by the internal configuration code |
| @@ -1487,6 +1513,7 @@ struct wireless_dev { | |||
| 1487 | struct cfg80211_internal_bss *authtry_bsses[MAX_AUTH_BSSES]; | 1513 | struct cfg80211_internal_bss *authtry_bsses[MAX_AUTH_BSSES]; |
| 1488 | struct cfg80211_internal_bss *auth_bsses[MAX_AUTH_BSSES]; | 1514 | struct cfg80211_internal_bss *auth_bsses[MAX_AUTH_BSSES]; |
| 1489 | struct cfg80211_internal_bss *current_bss; /* associated / joined */ | 1515 | struct cfg80211_internal_bss *current_bss; /* associated / joined */ |
| 1516 | struct ieee80211_channel *channel; | ||
| 1490 | 1517 | ||
| 1491 | bool ps; | 1518 | bool ps; |
| 1492 | int ps_timeout; | 1519 | int ps_timeout; |
| @@ -1627,7 +1654,7 @@ struct ieee80211_radiotap_iterator { | |||
| 1627 | const struct ieee80211_radiotap_namespace *current_namespace; | 1654 | const struct ieee80211_radiotap_namespace *current_namespace; |
| 1628 | 1655 | ||
| 1629 | unsigned char *_arg, *_next_ns_data; | 1656 | unsigned char *_arg, *_next_ns_data; |
| 1630 | uint32_t *_next_bitmap; | 1657 | __le32 *_next_bitmap; |
| 1631 | 1658 | ||
| 1632 | unsigned char *this_arg; | 1659 | unsigned char *this_arg; |
| 1633 | int this_arg_index; | 1660 | int this_arg_index; |
| @@ -2337,4 +2364,18 @@ bool cfg80211_rx_action(struct net_device *dev, int freq, const u8 *buf, | |||
| 2337 | void cfg80211_action_tx_status(struct net_device *dev, u64 cookie, | 2364 | void cfg80211_action_tx_status(struct net_device *dev, u64 cookie, |
| 2338 | const u8 *buf, size_t len, bool ack, gfp_t gfp); | 2365 | const u8 *buf, size_t len, bool ack, gfp_t gfp); |
| 2339 | 2366 | ||
| 2367 | |||
| 2368 | /** | ||
| 2369 | * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event | ||
| 2370 | * @dev: network device | ||
| 2371 | * @rssi_event: the triggered RSSI event | ||
| 2372 | * @gfp: context flags | ||
| 2373 | * | ||
| 2374 | * This function is called when a configured connection quality monitoring | ||
| 2375 | * rssi threshold reached event occurs. | ||
| 2376 | */ | ||
| 2377 | void cfg80211_cqm_rssi_notify(struct net_device *dev, | ||
| 2378 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
| 2379 | gfp_t gfp); | ||
| 2380 | |||
| 2340 | #endif /* __NET_CFG80211_H */ | 2381 | #endif /* __NET_CFG80211_H */ |
diff --git a/include/net/dn_fib.h b/include/net/dn_fib.h index 52da6c3dd50d..bbcde3238e58 100644 --- a/include/net/dn_fib.h +++ b/include/net/dn_fib.h | |||
| @@ -50,10 +50,6 @@ struct dn_fib_info { | |||
| 50 | __le16 fib_prefsrc; | 50 | __le16 fib_prefsrc; |
| 51 | __u32 fib_priority; | 51 | __u32 fib_priority; |
| 52 | __u32 fib_metrics[RTAX_MAX]; | 52 | __u32 fib_metrics[RTAX_MAX]; |
| 53 | #define dn_fib_mtu fib_metrics[RTAX_MTU-1] | ||
| 54 | #define dn_fib_window fib_metrics[RTAX_WINDOW-1] | ||
| 55 | #define dn_fib_rtt fib_metrics[RTAX_RTT-1] | ||
| 56 | #define dn_fib_advmss fib_metrics[RTAX_ADVMSS-1] | ||
| 57 | int fib_nhs; | 53 | int fib_nhs; |
| 58 | int fib_power; | 54 | int fib_power; |
| 59 | struct dn_fib_nh fib_nh[0]; | 55 | struct dn_fib_nh fib_nh[0]; |
diff --git a/include/net/dst.h b/include/net/dst.h index ce078cda6b74..612069beda73 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -168,6 +168,12 @@ static inline void dst_use(struct dst_entry *dst, unsigned long time) | |||
| 168 | dst->lastuse = time; | 168 | dst->lastuse = time; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | static inline void dst_use_noref(struct dst_entry *dst, unsigned long time) | ||
| 172 | { | ||
| 173 | dst->__use++; | ||
| 174 | dst->lastuse = time; | ||
| 175 | } | ||
| 176 | |||
| 171 | static inline | 177 | static inline |
| 172 | struct dst_entry * dst_clone(struct dst_entry * dst) | 178 | struct dst_entry * dst_clone(struct dst_entry * dst) |
| 173 | { | 179 | { |
| @@ -177,11 +183,67 @@ struct dst_entry * dst_clone(struct dst_entry * dst) | |||
| 177 | } | 183 | } |
| 178 | 184 | ||
| 179 | extern void dst_release(struct dst_entry *dst); | 185 | extern void dst_release(struct dst_entry *dst); |
| 186 | |||
| 187 | static inline void refdst_drop(unsigned long refdst) | ||
| 188 | { | ||
| 189 | if (!(refdst & SKB_DST_NOREF)) | ||
| 190 | dst_release((struct dst_entry *)(refdst & SKB_DST_PTRMASK)); | ||
| 191 | } | ||
| 192 | |||
| 193 | /** | ||
| 194 | * skb_dst_drop - drops skb dst | ||
| 195 | * @skb: buffer | ||
| 196 | * | ||
| 197 | * Drops dst reference count if a reference was taken. | ||
| 198 | */ | ||
| 180 | static inline void skb_dst_drop(struct sk_buff *skb) | 199 | static inline void skb_dst_drop(struct sk_buff *skb) |
| 181 | { | 200 | { |
| 182 | if (skb->_skb_dst) | 201 | if (skb->_skb_refdst) { |
| 183 | dst_release(skb_dst(skb)); | 202 | refdst_drop(skb->_skb_refdst); |
| 184 | skb->_skb_dst = 0UL; | 203 | skb->_skb_refdst = 0UL; |
| 204 | } | ||
| 205 | } | ||
| 206 | |||
| 207 | static inline void skb_dst_copy(struct sk_buff *nskb, const struct sk_buff *oskb) | ||
| 208 | { | ||
| 209 | nskb->_skb_refdst = oskb->_skb_refdst; | ||
| 210 | if (!(nskb->_skb_refdst & SKB_DST_NOREF)) | ||
| 211 | dst_clone(skb_dst(nskb)); | ||
| 212 | } | ||
| 213 | |||
| 214 | /** | ||
| 215 | * skb_dst_force - makes sure skb dst is refcounted | ||
| 216 | * @skb: buffer | ||
| 217 | * | ||
| 218 | * If dst is not yet refcounted, let's do it | ||
| 219 | */ | ||
| 220 | static inline void skb_dst_force(struct sk_buff *skb) | ||
| 221 | { | ||
| 222 | if (skb_dst_is_noref(skb)) { | ||
| 223 | WARN_ON(!rcu_read_lock_held()); | ||
| 224 | skb->_skb_refdst &= ~SKB_DST_NOREF; | ||
| 225 | dst_clone(skb_dst(skb)); | ||
| 226 | } | ||
| 227 | } | ||
| 228 | |||
| 229 | |||
| 230 | /** | ||
| 231 | * skb_tunnel_rx - prepare skb for rx reinsert | ||
| 232 | * @skb: buffer | ||
| 233 | * @dev: tunnel device | ||
| 234 | * | ||
| 235 | * After decapsulation, packet is going to re-enter (netif_rx()) our stack, | ||
| 236 | * so make some cleanups, and perform accounting. | ||
| 237 | */ | ||
| 238 | static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) | ||
| 239 | { | ||
| 240 | skb->dev = dev; | ||
| 241 | /* TODO : stats should be SMP safe */ | ||
| 242 | dev->stats.rx_packets++; | ||
| 243 | dev->stats.rx_bytes += skb->len; | ||
| 244 | skb->rxhash = 0; | ||
| 245 | skb_dst_drop(skb); | ||
| 246 | nf_reset(skb); | ||
| 185 | } | 247 | } |
| 186 | 248 | ||
| 187 | /* Children define the path of the packet through the | 249 | /* Children define the path of the packet through the |
| @@ -225,21 +287,6 @@ static inline void dst_confirm(struct dst_entry *dst) | |||
| 225 | neigh_confirm(dst->neighbour); | 287 | neigh_confirm(dst->neighbour); |
| 226 | } | 288 | } |
| 227 | 289 | ||
| 228 | static inline void dst_negative_advice(struct dst_entry **dst_p, | ||
| 229 | struct sock *sk) | ||
| 230 | { | ||
| 231 | struct dst_entry * dst = *dst_p; | ||
| 232 | if (dst && dst->ops->negative_advice) { | ||
| 233 | *dst_p = dst->ops->negative_advice(dst); | ||
| 234 | |||
| 235 | if (dst != *dst_p) { | ||
| 236 | extern void sk_reset_txq(struct sock *sk); | ||
| 237 | |||
| 238 | sk_reset_txq(sk); | ||
| 239 | } | ||
| 240 | } | ||
| 241 | } | ||
| 242 | |||
| 243 | static inline void dst_link_failure(struct sk_buff *skb) | 290 | static inline void dst_link_failure(struct sk_buff *skb) |
| 244 | { | 291 | { |
| 245 | struct dst_entry *dst = skb_dst(skb); | 292 | struct dst_entry *dst = skb_dst(skb); |
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h index c49086d2bc7d..e8923bc20f9f 100644 --- a/include/net/fib_rules.h +++ b/include/net/fib_rules.h | |||
| @@ -104,7 +104,7 @@ static inline u32 frh_get_table(struct fib_rule_hdr *frh, struct nlattr **nla) | |||
| 104 | return frh->table; | 104 | return frh->table; |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | extern struct fib_rules_ops *fib_rules_register(struct fib_rules_ops *, struct net *); | 107 | extern struct fib_rules_ops *fib_rules_register(const struct fib_rules_ops *, struct net *); |
| 108 | extern void fib_rules_unregister(struct fib_rules_ops *); | 108 | extern void fib_rules_unregister(struct fib_rules_ops *); |
| 109 | extern void fib_rules_cleanup_ops(struct fib_rules_ops *); | 109 | extern void fib_rules_cleanup_ops(struct fib_rules_ops *); |
| 110 | 110 | ||
| @@ -114,4 +114,5 @@ extern int fib_rules_lookup(struct fib_rules_ops *, | |||
| 114 | extern int fib_default_rule_add(struct fib_rules_ops *, | 114 | extern int fib_default_rule_add(struct fib_rules_ops *, |
| 115 | u32 pref, u32 table, | 115 | u32 pref, u32 table, |
| 116 | u32 flags); | 116 | u32 flags); |
| 117 | extern u32 fib_default_rule_pref(struct fib_rules_ops *ops); | ||
| 117 | #endif | 118 | #endif |
diff --git a/include/net/flow.h b/include/net/flow.h index 809970b7dfee..bb08692a20b0 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
| @@ -86,11 +86,26 @@ struct flowi { | |||
| 86 | 86 | ||
| 87 | struct net; | 87 | struct net; |
| 88 | struct sock; | 88 | struct sock; |
| 89 | typedef int (*flow_resolve_t)(struct net *net, struct flowi *key, u16 family, | 89 | struct flow_cache_ops; |
| 90 | u8 dir, void **objp, atomic_t **obj_refp); | 90 | |
| 91 | struct flow_cache_object { | ||
| 92 | const struct flow_cache_ops *ops; | ||
| 93 | }; | ||
| 94 | |||
| 95 | struct flow_cache_ops { | ||
| 96 | struct flow_cache_object *(*get)(struct flow_cache_object *); | ||
| 97 | int (*check)(struct flow_cache_object *); | ||
| 98 | void (*delete)(struct flow_cache_object *); | ||
| 99 | }; | ||
| 100 | |||
| 101 | typedef struct flow_cache_object *(*flow_resolve_t)( | ||
| 102 | struct net *net, struct flowi *key, u16 family, | ||
| 103 | u8 dir, struct flow_cache_object *oldobj, void *ctx); | ||
| 104 | |||
| 105 | extern struct flow_cache_object *flow_cache_lookup( | ||
| 106 | struct net *net, struct flowi *key, u16 family, | ||
| 107 | u8 dir, flow_resolve_t resolver, void *ctx); | ||
| 91 | 108 | ||
| 92 | extern void *flow_cache_lookup(struct net *net, struct flowi *key, u16 family, | ||
| 93 | u8 dir, flow_resolve_t resolver); | ||
| 94 | extern void flow_cache_flush(void); | 109 | extern void flow_cache_flush(void); |
| 95 | extern atomic_t flow_cache_genid; | 110 | extern atomic_t flow_cache_genid; |
| 96 | 111 | ||
diff --git a/include/net/icmp.h b/include/net/icmp.h index 15b3dfe9fce8..6e991e0d0d6f 100644 --- a/include/net/icmp.h +++ b/include/net/icmp.h | |||
| @@ -48,15 +48,4 @@ extern void icmp_out_count(struct net *net, unsigned char type); | |||
| 48 | /* Move into dst.h ? */ | 48 | /* Move into dst.h ? */ |
| 49 | extern int xrlim_allow(struct dst_entry *dst, int timeout); | 49 | extern int xrlim_allow(struct dst_entry *dst, int timeout); |
| 50 | 50 | ||
| 51 | struct raw_sock { | ||
| 52 | /* inet_sock has to be the first member */ | ||
| 53 | struct inet_sock inet; | ||
| 54 | struct icmp_filter filter; | ||
| 55 | }; | ||
| 56 | |||
| 57 | static inline struct raw_sock *raw_sk(const struct sock *sk) | ||
| 58 | { | ||
| 59 | return (struct raw_sock *)sk; | ||
| 60 | } | ||
| 61 | |||
| 62 | #endif /* _ICMP_H */ | 51 | #endif /* _ICMP_H */ |
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h index 545d8b059bef..f95ff8d9aa47 100644 --- a/include/net/if_inet6.h +++ b/include/net/if_inet6.h | |||
| @@ -32,6 +32,13 @@ | |||
| 32 | 32 | ||
| 33 | #ifdef __KERNEL__ | 33 | #ifdef __KERNEL__ |
| 34 | 34 | ||
| 35 | enum { | ||
| 36 | INET6_IFADDR_STATE_DAD, | ||
| 37 | INET6_IFADDR_STATE_POSTDAD, | ||
| 38 | INET6_IFADDR_STATE_UP, | ||
| 39 | INET6_IFADDR_STATE_DEAD, | ||
| 40 | }; | ||
| 41 | |||
| 35 | struct inet6_ifaddr { | 42 | struct inet6_ifaddr { |
| 36 | struct in6_addr addr; | 43 | struct in6_addr addr; |
| 37 | __u32 prefix_len; | 44 | __u32 prefix_len; |
| @@ -40,6 +47,9 @@ struct inet6_ifaddr { | |||
| 40 | __u32 prefered_lft; | 47 | __u32 prefered_lft; |
| 41 | atomic_t refcnt; | 48 | atomic_t refcnt; |
| 42 | spinlock_t lock; | 49 | spinlock_t lock; |
| 50 | spinlock_t state_lock; | ||
| 51 | |||
| 52 | int state; | ||
| 43 | 53 | ||
| 44 | __u8 probes; | 54 | __u8 probes; |
| 45 | __u8 flags; | 55 | __u8 flags; |
| @@ -54,16 +64,15 @@ struct inet6_ifaddr { | |||
| 54 | struct inet6_dev *idev; | 64 | struct inet6_dev *idev; |
| 55 | struct rt6_info *rt; | 65 | struct rt6_info *rt; |
| 56 | 66 | ||
| 57 | struct inet6_ifaddr *lst_next; /* next addr in addr_lst */ | 67 | struct hlist_node addr_lst; |
| 58 | struct inet6_ifaddr *if_next; /* next addr in inet6_dev */ | 68 | struct list_head if_list; |
| 59 | 69 | ||
| 60 | #ifdef CONFIG_IPV6_PRIVACY | 70 | #ifdef CONFIG_IPV6_PRIVACY |
| 61 | struct inet6_ifaddr *tmp_next; /* next addr in tempaddr_lst */ | 71 | struct list_head tmp_list; |
| 62 | struct inet6_ifaddr *ifpub; | 72 | struct inet6_ifaddr *ifpub; |
| 63 | int regen_count; | 73 | int regen_count; |
| 64 | #endif | 74 | #endif |
| 65 | 75 | struct rcu_head rcu; | |
| 66 | int dead; | ||
| 67 | }; | 76 | }; |
| 68 | 77 | ||
| 69 | struct ip6_sf_socklist { | 78 | struct ip6_sf_socklist { |
| @@ -151,9 +160,9 @@ struct ipv6_devstat { | |||
| 151 | }; | 160 | }; |
| 152 | 161 | ||
| 153 | struct inet6_dev { | 162 | struct inet6_dev { |
| 154 | struct net_device *dev; | 163 | struct net_device *dev; |
| 155 | 164 | ||
| 156 | struct inet6_ifaddr *addr_list; | 165 | struct list_head addr_list; |
| 157 | 166 | ||
| 158 | struct ifmcaddr6 *mc_list; | 167 | struct ifmcaddr6 *mc_list; |
| 159 | struct ifmcaddr6 *mc_tomb; | 168 | struct ifmcaddr6 *mc_tomb; |
| @@ -175,7 +184,7 @@ struct inet6_dev { | |||
| 175 | #ifdef CONFIG_IPV6_PRIVACY | 184 | #ifdef CONFIG_IPV6_PRIVACY |
| 176 | u8 rndid[8]; | 185 | u8 rndid[8]; |
| 177 | struct timer_list regen_timer; | 186 | struct timer_list regen_timer; |
| 178 | struct inet6_ifaddr *tempaddr_list; | 187 | struct list_head tempaddr_list; |
| 179 | #endif | 188 | #endif |
| 180 | 189 | ||
| 181 | struct neigh_parms *nd_parms; | 190 | struct neigh_parms *nd_parms; |
diff --git a/include/net/inet6_connection_sock.h b/include/net/inet6_connection_sock.h index f13ddc2543b1..aae08f686633 100644 --- a/include/net/inet6_connection_sock.h +++ b/include/net/inet6_connection_sock.h | |||
| @@ -38,5 +38,5 @@ extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk, | |||
| 38 | 38 | ||
| 39 | extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr); | 39 | extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr); |
| 40 | 40 | ||
| 41 | extern int inet6_csk_xmit(struct sk_buff *skb, int ipfragok); | 41 | extern int inet6_csk_xmit(struct sk_buff *skb); |
| 42 | #endif /* _INET6_CONNECTION_SOCK_H */ | 42 | #endif /* _INET6_CONNECTION_SOCK_H */ |
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 696d6e4ce68a..b6d3b55da19b 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
| @@ -36,9 +36,8 @@ struct tcp_congestion_ops; | |||
| 36 | * (i.e. things that depend on the address family) | 36 | * (i.e. things that depend on the address family) |
| 37 | */ | 37 | */ |
| 38 | struct inet_connection_sock_af_ops { | 38 | struct inet_connection_sock_af_ops { |
| 39 | int (*queue_xmit)(struct sk_buff *skb, int ipfragok); | 39 | int (*queue_xmit)(struct sk_buff *skb); |
| 40 | void (*send_check)(struct sock *sk, int len, | 40 | void (*send_check)(struct sock *sk, struct sk_buff *skb); |
| 41 | struct sk_buff *skb); | ||
| 42 | int (*rebuild_header)(struct sock *sk); | 41 | int (*rebuild_header)(struct sock *sk); |
| 43 | int (*conn_request)(struct sock *sk, struct sk_buff *skb); | 42 | int (*conn_request)(struct sock *sk, struct sk_buff *skb); |
| 44 | struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb, | 43 | struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb, |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 83fd34437cf1..1653de515cee 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
| 22 | #include <linux/types.h> | 22 | #include <linux/types.h> |
| 23 | #include <linux/jhash.h> | 23 | #include <linux/jhash.h> |
| 24 | #include <linux/netdevice.h> | ||
| 24 | 25 | ||
| 25 | #include <net/flow.h> | 26 | #include <net/flow.h> |
| 26 | #include <net/sock.h> | 27 | #include <net/sock.h> |
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index 79f67eae8a7e..a066fdd50da6 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h | |||
| @@ -224,7 +224,9 @@ static inline | |||
| 224 | struct net *twsk_net(const struct inet_timewait_sock *twsk) | 224 | struct net *twsk_net(const struct inet_timewait_sock *twsk) |
| 225 | { | 225 | { |
| 226 | #ifdef CONFIG_NET_NS | 226 | #ifdef CONFIG_NET_NS |
| 227 | return rcu_dereference(twsk->tw_net); | 227 | return rcu_dereference_raw(twsk->tw_net); /* protected by locking, */ |
| 228 | /* reference counting, */ | ||
| 229 | /* initialization, or RCU. */ | ||
| 228 | #else | 230 | #else |
| 229 | return &init_net; | 231 | return &init_net; |
| 230 | #endif | 232 | #endif |
diff --git a/include/net/ip.h b/include/net/ip.h index 503994a38ed1..63548f0a44b1 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -101,7 +101,7 @@ extern int ip_do_nat(struct sk_buff *skb); | |||
| 101 | extern void ip_send_check(struct iphdr *ip); | 101 | extern void ip_send_check(struct iphdr *ip); |
| 102 | extern int __ip_local_out(struct sk_buff *skb); | 102 | extern int __ip_local_out(struct sk_buff *skb); |
| 103 | extern int ip_local_out(struct sk_buff *skb); | 103 | extern int ip_local_out(struct sk_buff *skb); |
| 104 | extern int ip_queue_xmit(struct sk_buff *skb, int ipfragok); | 104 | extern int ip_queue_xmit(struct sk_buff *skb); |
| 105 | extern void ip_init(void); | 105 | extern void ip_init(void); |
| 106 | extern int ip_append_data(struct sock *sk, | 106 | extern int ip_append_data(struct sock *sk, |
| 107 | int getfrag(void *from, char *to, int offset, int len, | 107 | int getfrag(void *from, char *to, int offset, int len, |
| @@ -184,6 +184,12 @@ extern struct local_ports { | |||
| 184 | } sysctl_local_ports; | 184 | } sysctl_local_ports; |
| 185 | extern void inet_get_local_port_range(int *low, int *high); | 185 | extern void inet_get_local_port_range(int *low, int *high); |
| 186 | 186 | ||
| 187 | extern unsigned long *sysctl_local_reserved_ports; | ||
| 188 | static inline int inet_is_reserved_local_port(int port) | ||
| 189 | { | ||
| 190 | return test_bit(port, sysctl_local_reserved_ports); | ||
| 191 | } | ||
| 192 | |||
| 187 | extern int sysctl_ip_default_ttl; | 193 | extern int sysctl_ip_default_ttl; |
| 188 | extern int sysctl_ip_nonlocal_bind; | 194 | extern int sysctl_ip_nonlocal_bind; |
| 189 | 195 | ||
| @@ -393,6 +399,7 @@ extern int ip_options_rcv_srr(struct sk_buff *skb); | |||
| 393 | * Functions provided by ip_sockglue.c | 399 | * Functions provided by ip_sockglue.c |
| 394 | */ | 400 | */ |
| 395 | 401 | ||
| 402 | extern int ip_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); | ||
| 396 | extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); | 403 | extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); |
| 397 | extern int ip_cmsg_send(struct net *net, | 404 | extern int ip_cmsg_send(struct net *net, |
| 398 | struct msghdr *msg, struct ipcm_cookie *ipc); | 405 | struct msghdr *msg, struct ipcm_cookie *ipc); |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 86f46c49e318..4b1dc1161c37 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
| @@ -88,34 +88,37 @@ struct rt6_info { | |||
| 88 | struct dst_entry dst; | 88 | struct dst_entry dst; |
| 89 | } u; | 89 | } u; |
| 90 | 90 | ||
| 91 | struct inet6_dev *rt6i_idev; | ||
| 92 | |||
| 93 | #define rt6i_dev u.dst.dev | 91 | #define rt6i_dev u.dst.dev |
| 94 | #define rt6i_nexthop u.dst.neighbour | 92 | #define rt6i_nexthop u.dst.neighbour |
| 95 | #define rt6i_expires u.dst.expires | 93 | #define rt6i_expires u.dst.expires |
| 96 | 94 | ||
| 95 | /* | ||
| 96 | * Tail elements of dst_entry (__refcnt etc.) | ||
| 97 | * and these elements (rarely used in hot path) are in | ||
| 98 | * the same cache line. | ||
| 99 | */ | ||
| 100 | struct fib6_table *rt6i_table; | ||
| 97 | struct fib6_node *rt6i_node; | 101 | struct fib6_node *rt6i_node; |
| 98 | 102 | ||
| 99 | struct in6_addr rt6i_gateway; | 103 | struct in6_addr rt6i_gateway; |
| 100 | |||
| 101 | u32 rt6i_flags; | ||
| 102 | u32 rt6i_metric; | ||
| 103 | atomic_t rt6i_ref; | ||
| 104 | 104 | ||
| 105 | /* more non-fragment space at head required */ | 105 | atomic_t rt6i_ref; |
| 106 | unsigned short rt6i_nfheader_len; | ||
| 107 | |||
| 108 | u8 rt6i_protocol; | ||
| 109 | 106 | ||
| 110 | struct fib6_table *rt6i_table; | 107 | /* These are in a separate cache line. */ |
| 108 | struct rt6key rt6i_dst ____cacheline_aligned_in_smp; | ||
| 109 | u32 rt6i_flags; | ||
| 110 | struct rt6key rt6i_src; | ||
| 111 | u32 rt6i_metric; | ||
| 111 | 112 | ||
| 112 | struct rt6key rt6i_dst; | 113 | struct inet6_dev *rt6i_idev; |
| 113 | 114 | ||
| 114 | #ifdef CONFIG_XFRM | 115 | #ifdef CONFIG_XFRM |
| 115 | u32 rt6i_flow_cache_genid; | 116 | u32 rt6i_flow_cache_genid; |
| 116 | #endif | 117 | #endif |
| 118 | /* more non-fragment space at head required */ | ||
| 119 | unsigned short rt6i_nfheader_len; | ||
| 117 | 120 | ||
| 118 | struct rt6key rt6i_src; | 121 | u8 rt6i_protocol; |
| 119 | }; | 122 | }; |
| 120 | 123 | ||
| 121 | static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) | 124 | static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 68f67836e146..278312c95f96 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
| @@ -152,9 +152,9 @@ static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst, | |||
| 152 | static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, | 152 | static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, |
| 153 | struct in6_addr *daddr, struct in6_addr *saddr) | 153 | struct in6_addr *daddr, struct in6_addr *saddr) |
| 154 | { | 154 | { |
| 155 | write_lock(&sk->sk_dst_lock); | 155 | spin_lock(&sk->sk_dst_lock); |
| 156 | __ip6_dst_store(sk, dst, daddr, saddr); | 156 | __ip6_dst_store(sk, dst, daddr, saddr); |
| 157 | write_unlock(&sk->sk_dst_lock); | 157 | spin_unlock(&sk->sk_dst_lock); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | static inline int ipv6_unicast_destination(struct sk_buff *skb) | 160 | static inline int ipv6_unicast_destination(struct sk_buff *skb) |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index e72fb10ce573..eba5cc00325a 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -422,7 +422,7 @@ static inline int __ipv6_addr_diff(const void *token1, const void *token2, int a | |||
| 422 | for (i = 0; i < addrlen; i++) { | 422 | for (i = 0; i < addrlen; i++) { |
| 423 | __be32 xb = a1[i] ^ a2[i]; | 423 | __be32 xb = a1[i] ^ a2[i]; |
| 424 | if (xb) | 424 | if (xb) |
| 425 | return i * 32 + 32 - fls(ntohl(xb)); | 425 | return i * 32 + 31 - __fls(ntohl(xb)); |
| 426 | } | 426 | } |
| 427 | 427 | ||
| 428 | /* | 428 | /* |
| @@ -482,8 +482,7 @@ extern int ip6_rcv_finish(struct sk_buff *skb); | |||
| 482 | extern int ip6_xmit(struct sock *sk, | 482 | extern int ip6_xmit(struct sock *sk, |
| 483 | struct sk_buff *skb, | 483 | struct sk_buff *skb, |
| 484 | struct flowi *fl, | 484 | struct flowi *fl, |
| 485 | struct ipv6_txoptions *opt, | 485 | struct ipv6_txoptions *opt); |
| 486 | int ipfragok); | ||
| 487 | 486 | ||
| 488 | extern int ip6_nd_hdr(struct sock *sk, | 487 | extern int ip6_nd_hdr(struct sock *sk, |
| 489 | struct sk_buff *skb, | 488 | struct sk_buff *skb, |
| @@ -504,7 +503,8 @@ extern int ip6_append_data(struct sock *sk, | |||
| 504 | struct ipv6_txoptions *opt, | 503 | struct ipv6_txoptions *opt, |
| 505 | struct flowi *fl, | 504 | struct flowi *fl, |
| 506 | struct rt6_info *rt, | 505 | struct rt6_info *rt, |
| 507 | unsigned int flags); | 506 | unsigned int flags, |
| 507 | int dontfrag); | ||
| 508 | 508 | ||
| 509 | extern int ip6_push_pending_frames(struct sock *sk); | 509 | extern int ip6_push_pending_frames(struct sock *sk); |
| 510 | 510 | ||
| @@ -578,9 +578,11 @@ extern int ip6_datagram_connect(struct sock *sk, | |||
| 578 | struct sockaddr *addr, int addr_len); | 578 | struct sockaddr *addr, int addr_len); |
| 579 | 579 | ||
| 580 | extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); | 580 | extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); |
| 581 | extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); | ||
| 581 | extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, | 582 | extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, |
| 582 | u32 info, u8 *payload); | 583 | u32 info, u8 *payload); |
| 583 | extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); | 584 | extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); |
| 585 | extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu); | ||
| 584 | 586 | ||
| 585 | extern int inet6_release(struct socket *sock); | 587 | extern int inet6_release(struct socket *sock); |
| 586 | extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, | 588 | extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, |
diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h index b2b98f3fa265..3afdb21cc31d 100644 --- a/include/net/iw_handler.h +++ b/include/net/iw_handler.h | |||
| @@ -323,7 +323,7 @@ typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info, | |||
| 323 | struct iw_handler_def { | 323 | struct iw_handler_def { |
| 324 | 324 | ||
| 325 | /* Array of handlers for standard ioctls | 325 | /* Array of handlers for standard ioctls |
| 326 | * We will call dev->wireless_handlers->standard[ioctl - SIOCSIWCOMMIT] | 326 | * We will call dev->wireless_handlers->standard[ioctl - SIOCIWFIRST] |
| 327 | */ | 327 | */ |
| 328 | const iw_handler * standard; | 328 | const iw_handler * standard; |
| 329 | /* Number of handlers defined (more precisely, index of the | 329 | /* Number of handlers defined (more precisely, index of the |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 45d7d44d7cbe..5be900d19660 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -144,6 +144,8 @@ struct ieee80211_low_level_stats { | |||
| 144 | * new beacon (beaconing modes) | 144 | * new beacon (beaconing modes) |
| 145 | * @BSS_CHANGED_BEACON_ENABLED: Beaconing should be | 145 | * @BSS_CHANGED_BEACON_ENABLED: Beaconing should be |
| 146 | * enabled/disabled (beaconing modes) | 146 | * enabled/disabled (beaconing modes) |
| 147 | * @BSS_CHANGED_CQM: Connection quality monitor config changed | ||
| 148 | * @BSS_CHANGED_IBSS: IBSS join status changed | ||
| 147 | */ | 149 | */ |
| 148 | enum ieee80211_bss_change { | 150 | enum ieee80211_bss_change { |
| 149 | BSS_CHANGED_ASSOC = 1<<0, | 151 | BSS_CHANGED_ASSOC = 1<<0, |
| @@ -156,6 +158,10 @@ enum ieee80211_bss_change { | |||
| 156 | BSS_CHANGED_BSSID = 1<<7, | 158 | BSS_CHANGED_BSSID = 1<<7, |
| 157 | BSS_CHANGED_BEACON = 1<<8, | 159 | BSS_CHANGED_BEACON = 1<<8, |
| 158 | BSS_CHANGED_BEACON_ENABLED = 1<<9, | 160 | BSS_CHANGED_BEACON_ENABLED = 1<<9, |
| 161 | BSS_CHANGED_CQM = 1<<10, | ||
| 162 | BSS_CHANGED_IBSS = 1<<11, | ||
| 163 | |||
| 164 | /* when adding here, make sure to change ieee80211_reconfig */ | ||
| 159 | }; | 165 | }; |
| 160 | 166 | ||
| 161 | /** | 167 | /** |
| @@ -165,6 +171,8 @@ enum ieee80211_bss_change { | |||
| 165 | * to that BSS) that can change during the lifetime of the BSS. | 171 | * to that BSS) that can change during the lifetime of the BSS. |
| 166 | * | 172 | * |
| 167 | * @assoc: association status | 173 | * @assoc: association status |
| 174 | * @ibss_joined: indicates whether this station is part of an IBSS | ||
| 175 | * or not | ||
| 168 | * @aid: association ID number, valid only when @assoc is true | 176 | * @aid: association ID number, valid only when @assoc is true |
| 169 | * @use_cts_prot: use CTS protection | 177 | * @use_cts_prot: use CTS protection |
| 170 | * @use_short_preamble: use 802.11b short preamble; | 178 | * @use_short_preamble: use 802.11b short preamble; |
| @@ -183,13 +191,19 @@ enum ieee80211_bss_change { | |||
| 183 | * the current band. | 191 | * the current band. |
| 184 | * @bssid: The BSSID for this BSS | 192 | * @bssid: The BSSID for this BSS |
| 185 | * @enable_beacon: whether beaconing should be enabled or not | 193 | * @enable_beacon: whether beaconing should be enabled or not |
| 194 | * @channel_type: Channel type for this BSS -- the hardware might be | ||
| 195 | * configured for HT40+ while this BSS only uses no-HT, for | ||
| 196 | * example. | ||
| 186 | * @ht_operation_mode: HT operation mode (like in &struct ieee80211_ht_info). | 197 | * @ht_operation_mode: HT operation mode (like in &struct ieee80211_ht_info). |
| 187 | * This field is only valid when the channel type is one of the HT types. | 198 | * This field is only valid when the channel type is one of the HT types. |
| 199 | * @cqm_rssi_thold: Connection quality monitor RSSI threshold, a zero value | ||
| 200 | * implies disabled | ||
| 201 | * @cqm_rssi_hyst: Connection quality monitor RSSI hysteresis | ||
| 188 | */ | 202 | */ |
| 189 | struct ieee80211_bss_conf { | 203 | struct ieee80211_bss_conf { |
| 190 | const u8 *bssid; | 204 | const u8 *bssid; |
| 191 | /* association related data */ | 205 | /* association related data */ |
| 192 | bool assoc; | 206 | bool assoc, ibss_joined; |
| 193 | u16 aid; | 207 | u16 aid; |
| 194 | /* erp related data */ | 208 | /* erp related data */ |
| 195 | bool use_cts_prot; | 209 | bool use_cts_prot; |
| @@ -202,6 +216,9 @@ struct ieee80211_bss_conf { | |||
| 202 | u64 timestamp; | 216 | u64 timestamp; |
| 203 | u32 basic_rates; | 217 | u32 basic_rates; |
| 204 | u16 ht_operation_mode; | 218 | u16 ht_operation_mode; |
| 219 | s32 cqm_rssi_thold; | ||
| 220 | u32 cqm_rssi_hyst; | ||
| 221 | enum nl80211_channel_type channel_type; | ||
| 205 | }; | 222 | }; |
| 206 | 223 | ||
| 207 | /** | 224 | /** |
| @@ -267,6 +284,9 @@ struct ieee80211_bss_conf { | |||
| 267 | * @IEEE80211_TX_INTFL_NL80211_FRAME_TX: Frame was requested through nl80211 | 284 | * @IEEE80211_TX_INTFL_NL80211_FRAME_TX: Frame was requested through nl80211 |
| 268 | * MLME command (internal to mac80211 to figure out whether to send TX | 285 | * MLME command (internal to mac80211 to figure out whether to send TX |
| 269 | * status to user space) | 286 | * status to user space) |
| 287 | * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame | ||
| 288 | * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this | ||
| 289 | * frame and selects the maximum number of streams that it can use. | ||
| 270 | */ | 290 | */ |
| 271 | enum mac80211_tx_control_flags { | 291 | enum mac80211_tx_control_flags { |
| 272 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), | 292 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), |
| @@ -290,6 +310,9 @@ enum mac80211_tx_control_flags { | |||
| 290 | IEEE80211_TX_INTFL_RETRANSMISSION = BIT(19), | 310 | IEEE80211_TX_INTFL_RETRANSMISSION = BIT(19), |
| 291 | IEEE80211_TX_INTFL_HAS_RADIOTAP = BIT(20), | 311 | IEEE80211_TX_INTFL_HAS_RADIOTAP = BIT(20), |
| 292 | IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21), | 312 | IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21), |
| 313 | IEEE80211_TX_CTL_LDPC = BIT(22), | ||
| 314 | IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24), | ||
| 315 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | ||
| 293 | }; | 316 | }; |
| 294 | 317 | ||
| 295 | /** | 318 | /** |
| @@ -388,11 +411,11 @@ struct ieee80211_tx_rate { | |||
| 388 | * @status: union for status data | 411 | * @status: union for status data |
| 389 | * @driver_data: array of driver_data pointers | 412 | * @driver_data: array of driver_data pointers |
| 390 | * @ampdu_ack_len: number of acked aggregated frames. | 413 | * @ampdu_ack_len: number of acked aggregated frames. |
| 391 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 414 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
| 392 | * @ampdu_ack_map: block ack bit map for the aggregation. | 415 | * @ampdu_ack_map: block ack bit map for the aggregation. |
| 393 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 416 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
| 394 | * @ampdu_len: number of aggregated frames. | 417 | * @ampdu_len: number of aggregated frames. |
| 395 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 418 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
| 396 | * @ack_signal: signal strength of the ACK frame | 419 | * @ack_signal: signal strength of the ACK frame |
| 397 | */ | 420 | */ |
| 398 | struct ieee80211_tx_info { | 421 | struct ieee80211_tx_info { |
| @@ -543,7 +566,6 @@ enum mac80211_rx_flags { | |||
| 543 | * @signal: signal strength when receiving this frame, either in dBm, in dB or | 566 | * @signal: signal strength when receiving this frame, either in dBm, in dB or |
| 544 | * unspecified depending on the hardware capabilities flags | 567 | * unspecified depending on the hardware capabilities flags |
| 545 | * @IEEE80211_HW_SIGNAL_* | 568 | * @IEEE80211_HW_SIGNAL_* |
| 546 | * @noise: noise when receiving this frame, in dBm. | ||
| 547 | * @antenna: antenna used | 569 | * @antenna: antenna used |
| 548 | * @rate_idx: index of data rate into band's supported rates or MCS index if | 570 | * @rate_idx: index of data rate into band's supported rates or MCS index if |
| 549 | * HT rates are use (RX_FLAG_HT) | 571 | * HT rates are use (RX_FLAG_HT) |
| @@ -554,7 +576,6 @@ struct ieee80211_rx_status { | |||
| 554 | enum ieee80211_band band; | 576 | enum ieee80211_band band; |
| 555 | int freq; | 577 | int freq; |
| 556 | int signal; | 578 | int signal; |
| 557 | int noise; | ||
| 558 | int antenna; | 579 | int antenna; |
| 559 | int rate_idx; | 580 | int rate_idx; |
| 560 | int flag; | 581 | int flag; |
| @@ -580,11 +601,15 @@ struct ieee80211_rx_status { | |||
| 580 | * may turn the device off as much as possible. Typically, this flag will | 601 | * may turn the device off as much as possible. Typically, this flag will |
| 581 | * be set when an interface is set UP but not associated or scanning, but | 602 | * be set when an interface is set UP but not associated or scanning, but |
| 582 | * it can also be unset in that case when monitor interfaces are active. | 603 | * it can also be unset in that case when monitor interfaces are active. |
| 604 | * @IEEE80211_CONF_QOS: Enable 802.11e QoS also know as WMM (Wireless | ||
| 605 | * Multimedia). On some drivers (iwlwifi is one of know) we have | ||
| 606 | * to enable/disable QoS explicitly. | ||
| 583 | */ | 607 | */ |
| 584 | enum ieee80211_conf_flags { | 608 | enum ieee80211_conf_flags { |
| 585 | IEEE80211_CONF_MONITOR = (1<<0), | 609 | IEEE80211_CONF_MONITOR = (1<<0), |
| 586 | IEEE80211_CONF_PS = (1<<1), | 610 | IEEE80211_CONF_PS = (1<<1), |
| 587 | IEEE80211_CONF_IDLE = (1<<2), | 611 | IEEE80211_CONF_IDLE = (1<<2), |
| 612 | IEEE80211_CONF_QOS = (1<<3), | ||
| 588 | }; | 613 | }; |
| 589 | 614 | ||
| 590 | 615 | ||
| @@ -599,6 +624,7 @@ enum ieee80211_conf_flags { | |||
| 599 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed | 624 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed |
| 600 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed | 625 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed |
| 601 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed | 626 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed |
| 627 | * @IEEE80211_CONF_CHANGE_QOS: Quality of service was enabled or disabled | ||
| 602 | */ | 628 | */ |
| 603 | enum ieee80211_conf_changed { | 629 | enum ieee80211_conf_changed { |
| 604 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), | 630 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), |
| @@ -609,6 +635,7 @@ enum ieee80211_conf_changed { | |||
| 609 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), | 635 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), |
| 610 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), | 636 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), |
| 611 | IEEE80211_CONF_CHANGE_IDLE = BIT(8), | 637 | IEEE80211_CONF_CHANGE_IDLE = BIT(8), |
| 638 | IEEE80211_CONF_CHANGE_QOS = BIT(9), | ||
| 612 | }; | 639 | }; |
| 613 | 640 | ||
| 614 | /** | 641 | /** |
| @@ -649,6 +676,9 @@ enum ieee80211_smps_mode { | |||
| 649 | * @dynamic_ps_timeout: The dynamic powersave timeout (in ms), see the | 676 | * @dynamic_ps_timeout: The dynamic powersave timeout (in ms), see the |
| 650 | * powersave documentation below. This variable is valid only when | 677 | * powersave documentation below. This variable is valid only when |
| 651 | * the CONF_PS flag is set. | 678 | * the CONF_PS flag is set. |
| 679 | * @dynamic_ps_forced_timeout: The dynamic powersave timeout (in ms) configured | ||
| 680 | * by cfg80211 (essentially, wext) If set, this value overrules the value | ||
| 681 | * chosen by mac80211 based on ps qos network latency. | ||
| 652 | * | 682 | * |
| 653 | * @power_level: requested transmit power (in dBm) | 683 | * @power_level: requested transmit power (in dBm) |
| 654 | * | 684 | * |
| @@ -668,7 +698,7 @@ enum ieee80211_smps_mode { | |||
| 668 | */ | 698 | */ |
| 669 | struct ieee80211_conf { | 699 | struct ieee80211_conf { |
| 670 | u32 flags; | 700 | u32 flags; |
| 671 | int power_level, dynamic_ps_timeout; | 701 | int power_level, dynamic_ps_timeout, dynamic_ps_forced_timeout; |
| 672 | int max_sleep_period; | 702 | int max_sleep_period; |
| 673 | 703 | ||
| 674 | u16 listen_interval; | 704 | u16 listen_interval; |
| @@ -682,6 +712,28 @@ struct ieee80211_conf { | |||
| 682 | }; | 712 | }; |
| 683 | 713 | ||
| 684 | /** | 714 | /** |
| 715 | * struct ieee80211_channel_switch - holds the channel switch data | ||
| 716 | * | ||
| 717 | * The information provided in this structure is required for channel switch | ||
| 718 | * operation. | ||
| 719 | * | ||
| 720 | * @timestamp: value in microseconds of the 64-bit Time Synchronization | ||
| 721 | * Function (TSF) timer when the frame containing the channel switch | ||
| 722 | * announcement was received. This is simply the rx.mactime parameter | ||
| 723 | * the driver passed into mac80211. | ||
| 724 | * @block_tx: Indicates whether transmission must be blocked before the | ||
| 725 | * scheduled channel switch, as indicated by the AP. | ||
| 726 | * @channel: the new channel to switch to | ||
| 727 | * @count: the number of TBTT's until the channel switch event | ||
| 728 | */ | ||
| 729 | struct ieee80211_channel_switch { | ||
| 730 | u64 timestamp; | ||
| 731 | bool block_tx; | ||
| 732 | struct ieee80211_channel *channel; | ||
| 733 | u8 count; | ||
| 734 | }; | ||
| 735 | |||
| 736 | /** | ||
| 685 | * struct ieee80211_vif - per-interface data | 737 | * struct ieee80211_vif - per-interface data |
| 686 | * | 738 | * |
| 687 | * Data in this structure is continually present for driver | 739 | * Data in this structure is continually present for driver |
| @@ -779,6 +831,7 @@ struct ieee80211_key_conf { | |||
| 779 | u8 iv_len; | 831 | u8 iv_len; |
| 780 | u8 hw_key_idx; | 832 | u8 hw_key_idx; |
| 781 | u8 flags; | 833 | u8 flags; |
| 834 | u8 *ap_addr; | ||
| 782 | s8 keyidx; | 835 | s8 keyidx; |
| 783 | u8 keylen; | 836 | u8 keylen; |
| 784 | u8 key[0]; | 837 | u8 key[0]; |
| @@ -907,10 +960,6 @@ enum ieee80211_tkip_key_type { | |||
| 907 | * one milliwatt. This is the preferred method since it is standardized | 960 | * one milliwatt. This is the preferred method since it is standardized |
| 908 | * between different devices. @max_signal does not need to be set. | 961 | * between different devices. @max_signal does not need to be set. |
| 909 | * | 962 | * |
| 910 | * @IEEE80211_HW_NOISE_DBM: | ||
| 911 | * Hardware can provide noise (radio interference) values in units dBm, | ||
| 912 | * decibel difference from one milliwatt. | ||
| 913 | * | ||
| 914 | * @IEEE80211_HW_SPECTRUM_MGMT: | 963 | * @IEEE80211_HW_SPECTRUM_MGMT: |
| 915 | * Hardware supports spectrum management defined in 802.11h | 964 | * Hardware supports spectrum management defined in 802.11h |
| 916 | * Measurement, Channel Switch, Quieting, TPC | 965 | * Measurement, Channel Switch, Quieting, TPC |
| @@ -954,6 +1003,17 @@ enum ieee80211_tkip_key_type { | |||
| 954 | * Hardware can provide ack status reports of Tx frames to | 1003 | * Hardware can provide ack status reports of Tx frames to |
| 955 | * the stack. | 1004 | * the stack. |
| 956 | * | 1005 | * |
| 1006 | * @IEEE80211_HW_CONNECTION_MONITOR: | ||
| 1007 | * The hardware performs its own connection monitoring, including | ||
| 1008 | * periodic keep-alives to the AP and probing the AP on beacon loss. | ||
| 1009 | * When this flag is set, signaling beacon-loss will cause an immediate | ||
| 1010 | * change to disassociated state. | ||
| 1011 | * | ||
| 1012 | * @IEEE80211_HW_SUPPORTS_CQM_RSSI: | ||
| 1013 | * Hardware can do connection quality monitoring - i.e. it can monitor | ||
| 1014 | * connection quality related parameters, such as the RSSI level and | ||
| 1015 | * provide notifications if configured trigger levels are reached. | ||
| 1016 | * | ||
| 957 | */ | 1017 | */ |
| 958 | enum ieee80211_hw_flags { | 1018 | enum ieee80211_hw_flags { |
| 959 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, | 1019 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, |
| @@ -963,7 +1023,7 @@ enum ieee80211_hw_flags { | |||
| 963 | IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4, | 1023 | IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4, |
| 964 | IEEE80211_HW_SIGNAL_UNSPEC = 1<<5, | 1024 | IEEE80211_HW_SIGNAL_UNSPEC = 1<<5, |
| 965 | IEEE80211_HW_SIGNAL_DBM = 1<<6, | 1025 | IEEE80211_HW_SIGNAL_DBM = 1<<6, |
| 966 | IEEE80211_HW_NOISE_DBM = 1<<7, | 1026 | /* use this hole */ |
| 967 | IEEE80211_HW_SPECTRUM_MGMT = 1<<8, | 1027 | IEEE80211_HW_SPECTRUM_MGMT = 1<<8, |
| 968 | IEEE80211_HW_AMPDU_AGGREGATION = 1<<9, | 1028 | IEEE80211_HW_AMPDU_AGGREGATION = 1<<9, |
| 969 | IEEE80211_HW_SUPPORTS_PS = 1<<10, | 1029 | IEEE80211_HW_SUPPORTS_PS = 1<<10, |
| @@ -975,6 +1035,8 @@ enum ieee80211_hw_flags { | |||
| 975 | IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS = 1<<16, | 1035 | IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS = 1<<16, |
| 976 | IEEE80211_HW_SUPPORTS_UAPSD = 1<<17, | 1036 | IEEE80211_HW_SUPPORTS_UAPSD = 1<<17, |
| 977 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, | 1037 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, |
| 1038 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | ||
| 1039 | IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, | ||
| 978 | }; | 1040 | }; |
| 979 | 1041 | ||
| 980 | /** | 1042 | /** |
| @@ -1591,6 +1653,11 @@ enum ieee80211_ampdu_mlme_action { | |||
| 1591 | * @flush: Flush all pending frames from the hardware queue, making sure | 1653 | * @flush: Flush all pending frames from the hardware queue, making sure |
| 1592 | * that the hardware queues are empty. If the parameter @drop is set | 1654 | * that the hardware queues are empty. If the parameter @drop is set |
| 1593 | * to %true, pending frames may be dropped. The callback can sleep. | 1655 | * to %true, pending frames may be dropped. The callback can sleep. |
| 1656 | * | ||
| 1657 | * @channel_switch: Drivers that need (or want) to offload the channel | ||
| 1658 | * switch operation for CSAs received from the AP may implement this | ||
| 1659 | * callback. They must then call ieee80211_chswitch_done() to indicate | ||
| 1660 | * completion of the channel switch. | ||
| 1594 | */ | 1661 | */ |
| 1595 | struct ieee80211_ops { | 1662 | struct ieee80211_ops { |
| 1596 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); | 1663 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); |
| @@ -1606,7 +1673,7 @@ struct ieee80211_ops { | |||
| 1606 | struct ieee80211_bss_conf *info, | 1673 | struct ieee80211_bss_conf *info, |
| 1607 | u32 changed); | 1674 | u32 changed); |
| 1608 | u64 (*prepare_multicast)(struct ieee80211_hw *hw, | 1675 | u64 (*prepare_multicast)(struct ieee80211_hw *hw, |
| 1609 | int mc_count, struct dev_addr_list *mc_list); | 1676 | struct netdev_hw_addr_list *mc_list); |
| 1610 | void (*configure_filter)(struct ieee80211_hw *hw, | 1677 | void (*configure_filter)(struct ieee80211_hw *hw, |
| 1611 | unsigned int changed_flags, | 1678 | unsigned int changed_flags, |
| 1612 | unsigned int *total_flags, | 1679 | unsigned int *total_flags, |
| @@ -1621,7 +1688,7 @@ struct ieee80211_ops { | |||
| 1621 | struct ieee80211_key_conf *conf, | 1688 | struct ieee80211_key_conf *conf, |
| 1622 | struct ieee80211_sta *sta, | 1689 | struct ieee80211_sta *sta, |
| 1623 | u32 iv32, u16 *phase1key); | 1690 | u32 iv32, u16 *phase1key); |
| 1624 | int (*hw_scan)(struct ieee80211_hw *hw, | 1691 | int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| 1625 | struct cfg80211_scan_request *req); | 1692 | struct cfg80211_scan_request *req); |
| 1626 | void (*sw_scan_start)(struct ieee80211_hw *hw); | 1693 | void (*sw_scan_start)(struct ieee80211_hw *hw); |
| 1627 | void (*sw_scan_complete)(struct ieee80211_hw *hw); | 1694 | void (*sw_scan_complete)(struct ieee80211_hw *hw); |
| @@ -1646,13 +1713,16 @@ struct ieee80211_ops { | |||
| 1646 | struct ieee80211_vif *vif, | 1713 | struct ieee80211_vif *vif, |
| 1647 | enum ieee80211_ampdu_mlme_action action, | 1714 | enum ieee80211_ampdu_mlme_action action, |
| 1648 | struct ieee80211_sta *sta, u16 tid, u16 *ssn); | 1715 | struct ieee80211_sta *sta, u16 tid, u16 *ssn); |
| 1649 | 1716 | int (*get_survey)(struct ieee80211_hw *hw, int idx, | |
| 1717 | struct survey_info *survey); | ||
| 1650 | void (*rfkill_poll)(struct ieee80211_hw *hw); | 1718 | void (*rfkill_poll)(struct ieee80211_hw *hw); |
| 1651 | void (*set_coverage_class)(struct ieee80211_hw *hw, u8 coverage_class); | 1719 | void (*set_coverage_class)(struct ieee80211_hw *hw, u8 coverage_class); |
| 1652 | #ifdef CONFIG_NL80211_TESTMODE | 1720 | #ifdef CONFIG_NL80211_TESTMODE |
| 1653 | int (*testmode_cmd)(struct ieee80211_hw *hw, void *data, int len); | 1721 | int (*testmode_cmd)(struct ieee80211_hw *hw, void *data, int len); |
| 1654 | #endif | 1722 | #endif |
| 1655 | void (*flush)(struct ieee80211_hw *hw, bool drop); | 1723 | void (*flush)(struct ieee80211_hw *hw, bool drop); |
| 1724 | void (*channel_switch)(struct ieee80211_hw *hw, | ||
| 1725 | struct ieee80211_channel_switch *ch_switch); | ||
| 1656 | }; | 1726 | }; |
| 1657 | 1727 | ||
| 1658 | /** | 1728 | /** |
| @@ -1802,7 +1872,10 @@ void ieee80211_restart_hw(struct ieee80211_hw *hw); | |||
| 1802 | * ieee80211_rx - receive frame | 1872 | * ieee80211_rx - receive frame |
| 1803 | * | 1873 | * |
| 1804 | * Use this function to hand received frames to mac80211. The receive | 1874 | * Use this function to hand received frames to mac80211. The receive |
| 1805 | * buffer in @skb must start with an IEEE 802.11 header. | 1875 | * buffer in @skb must start with an IEEE 802.11 header. In case of a |
| 1876 | * paged @skb is used, the driver is recommended to put the ieee80211 | ||
| 1877 | * header of the frame on the linear part of the @skb to avoid memory | ||
| 1878 | * allocation and/or memcpy by the stack. | ||
| 1806 | * | 1879 | * |
| 1807 | * This function may not be called in IRQ context. Calls to this function | 1880 | * This function may not be called in IRQ context. Calls to this function |
| 1808 | * for a single hardware must be synchronized against each other. Calls to | 1881 | * for a single hardware must be synchronized against each other. Calls to |
| @@ -2364,12 +2437,52 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw, | |||
| 2364 | * | 2437 | * |
| 2365 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 2438 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
| 2366 | * | 2439 | * |
| 2367 | * When beacon filtering is enabled with IEEE80211_HW_BEACON_FILTERING and | 2440 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTERING and |
| 2368 | * IEEE80211_CONF_PS is set, the driver needs to inform whenever the | 2441 | * %IEEE80211_CONF_PS is set, the driver needs to inform whenever the |
| 2369 | * hardware is not receiving beacons with this function. | 2442 | * hardware is not receiving beacons with this function. |
| 2370 | */ | 2443 | */ |
| 2371 | void ieee80211_beacon_loss(struct ieee80211_vif *vif); | 2444 | void ieee80211_beacon_loss(struct ieee80211_vif *vif); |
| 2372 | 2445 | ||
| 2446 | /** | ||
| 2447 | * ieee80211_connection_loss - inform hardware has lost connection to the AP | ||
| 2448 | * | ||
| 2449 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | ||
| 2450 | * | ||
| 2451 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTERING, and | ||
| 2452 | * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver | ||
| 2453 | * needs to inform if the connection to the AP has been lost. | ||
| 2454 | * | ||
| 2455 | * This function will cause immediate change to disassociated state, | ||
| 2456 | * without connection recovery attempts. | ||
| 2457 | */ | ||
| 2458 | void ieee80211_connection_loss(struct ieee80211_vif *vif); | ||
| 2459 | |||
| 2460 | /** | ||
| 2461 | * ieee80211_cqm_rssi_notify - inform a configured connection quality monitoring | ||
| 2462 | * rssi threshold triggered | ||
| 2463 | * | ||
| 2464 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | ||
| 2465 | * @rssi_event: the RSSI trigger event type | ||
| 2466 | * @gfp: context flags | ||
| 2467 | * | ||
| 2468 | * When the %IEEE80211_HW_SUPPORTS_CQM_RSSI is set, and a connection quality | ||
| 2469 | * monitoring is configured with an rssi threshold, the driver will inform | ||
| 2470 | * whenever the rssi level reaches the threshold. | ||
| 2471 | */ | ||
| 2472 | void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif, | ||
| 2473 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
| 2474 | gfp_t gfp); | ||
| 2475 | |||
| 2476 | /** | ||
| 2477 | * ieee80211_chswitch_done - Complete channel switch process | ||
| 2478 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | ||
| 2479 | * @success: make the channel switch successful or not | ||
| 2480 | * | ||
| 2481 | * Complete the channel switch post-process: set the new operational channel | ||
| 2482 | * and wake up the suspended queues. | ||
| 2483 | */ | ||
| 2484 | void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success); | ||
| 2485 | |||
| 2373 | /* Rate control API */ | 2486 | /* Rate control API */ |
| 2374 | 2487 | ||
| 2375 | /** | 2488 | /** |
diff --git a/include/net/mld.h b/include/net/mld.h new file mode 100644 index 000000000000..467143cd4e2f --- /dev/null +++ b/include/net/mld.h | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | #ifndef LINUX_MLD_H | ||
| 2 | #define LINUX_MLD_H | ||
| 3 | |||
| 4 | #include <linux/in6.h> | ||
| 5 | #include <linux/icmpv6.h> | ||
| 6 | |||
| 7 | /* MLDv1 Query/Report/Done */ | ||
| 8 | struct mld_msg { | ||
| 9 | struct icmp6hdr mld_hdr; | ||
| 10 | struct in6_addr mld_mca; | ||
| 11 | }; | ||
| 12 | |||
| 13 | #define mld_type mld_hdr.icmp6_type | ||
| 14 | #define mld_code mld_hdr.icmp6_code | ||
| 15 | #define mld_cksum mld_hdr.icmp6_cksum | ||
| 16 | #define mld_maxdelay mld_hdr.icmp6_maxdelay | ||
| 17 | #define mld_reserved mld_hdr.icmp6_dataun.un_data16[1] | ||
| 18 | |||
| 19 | /* Multicast Listener Discovery version 2 headers */ | ||
| 20 | /* MLDv2 Report */ | ||
| 21 | struct mld2_grec { | ||
| 22 | __u8 grec_type; | ||
| 23 | __u8 grec_auxwords; | ||
| 24 | __be16 grec_nsrcs; | ||
| 25 | struct in6_addr grec_mca; | ||
| 26 | struct in6_addr grec_src[0]; | ||
| 27 | }; | ||
| 28 | |||
| 29 | struct mld2_report { | ||
| 30 | struct icmp6hdr mld2r_hdr; | ||
| 31 | struct mld2_grec mld2r_grec[0]; | ||
| 32 | }; | ||
| 33 | |||
| 34 | #define mld2r_type mld2r_hdr.icmp6_type | ||
| 35 | #define mld2r_resv1 mld2r_hdr.icmp6_code | ||
| 36 | #define mld2r_cksum mld2r_hdr.icmp6_cksum | ||
| 37 | #define mld2r_resv2 mld2r_hdr.icmp6_dataun.un_data16[0] | ||
| 38 | #define mld2r_ngrec mld2r_hdr.icmp6_dataun.un_data16[1] | ||
| 39 | |||
| 40 | /* MLDv2 Query */ | ||
| 41 | struct mld2_query { | ||
| 42 | struct icmp6hdr mld2q_hdr; | ||
| 43 | struct in6_addr mld2q_mca; | ||
| 44 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
| 45 | __u8 mld2q_qrv:3, | ||
| 46 | mld2q_suppress:1, | ||
| 47 | mld2q_resv2:4; | ||
| 48 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
| 49 | __u8 mld2q_resv2:4, | ||
| 50 | mld2q_suppress:1, | ||
| 51 | mld2q_qrv:3; | ||
| 52 | #else | ||
| 53 | #error "Please fix <asm/byteorder.h>" | ||
| 54 | #endif | ||
| 55 | __u8 mld2q_qqic; | ||
| 56 | __be16 mld2q_nsrcs; | ||
| 57 | struct in6_addr mld2q_srcs[0]; | ||
| 58 | }; | ||
| 59 | |||
| 60 | #define mld2q_type mld2q_hdr.icmp6_type | ||
| 61 | #define mld2q_code mld2q_hdr.icmp6_code | ||
| 62 | #define mld2q_cksum mld2q_hdr.icmp6_cksum | ||
| 63 | #define mld2q_mrc mld2q_hdr.icmp6_maxdelay | ||
| 64 | #define mld2q_resv1 mld2q_hdr.icmp6_dataun.un_data16[1] | ||
| 65 | |||
| 66 | /* Max Response Code */ | ||
| 67 | #define MLDV2_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value)) | ||
| 68 | #define MLDV2_EXP(thresh, nbmant, nbexp, value) \ | ||
| 69 | ((value) < (thresh) ? (value) : \ | ||
| 70 | ((MLDV2_MASK(value, nbmant) | (1<<(nbmant))) << \ | ||
| 71 | (MLDV2_MASK((value) >> (nbmant), nbexp) + (nbexp)))) | ||
| 72 | |||
| 73 | #define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value) | ||
| 74 | |||
| 75 | #endif | ||
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index da1d58be31b7..eb21340a573b 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
| @@ -299,6 +299,20 @@ static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) | |||
| 299 | return 0; | 299 | return 0; |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | #ifdef CONFIG_BRIDGE_NETFILTER | ||
| 303 | static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb) | ||
| 304 | { | ||
| 305 | unsigned seq, hh_alen; | ||
| 306 | |||
| 307 | do { | ||
| 308 | seq = read_seqbegin(&hh->hh_lock); | ||
| 309 | hh_alen = HH_DATA_ALIGN(ETH_HLEN); | ||
| 310 | memcpy(skb->data - hh_alen, hh->hh_data, ETH_ALEN + hh_alen - ETH_HLEN); | ||
| 311 | } while (read_seqretry(&hh->hh_lock, seq)); | ||
| 312 | return 0; | ||
| 313 | } | ||
| 314 | #endif | ||
| 315 | |||
| 302 | static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb) | 316 | static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb) |
| 303 | { | 317 | { |
| 304 | unsigned seq; | 318 | unsigned seq; |
diff --git a/include/net/netns/generic.h b/include/net/netns/generic.h index ff4982ab84b6..81a31c0db3e7 100644 --- a/include/net/netns/generic.h +++ b/include/net/netns/generic.h | |||
| @@ -14,11 +14,8 @@ | |||
| 14 | * The rules are simple: | 14 | * The rules are simple: |
| 15 | * 1. set pernet_operations->id. After register_pernet_device you | 15 | * 1. set pernet_operations->id. After register_pernet_device you |
| 16 | * will have the id of your private pointer. | 16 | * will have the id of your private pointer. |
| 17 | * 2. Either set pernet_operations->size (to have the code allocate and | 17 | * 2. set pernet_operations->size to have the code allocate and free |
| 18 | * free a private structure pointed to from struct net ) or | 18 | * a private structure pointed to from struct net. |
| 19 | * call net_assign_generic() to put the private data on the struct | ||
| 20 | * net (most preferably this should be done in the ->init callback | ||
| 21 | * of the ops registered); | ||
| 22 | * 3. do not change this pointer while the net is alive; | 19 | * 3. do not change this pointer while the net is alive; |
| 23 | * 4. do not try to have any private reference on the net_generic object. | 20 | * 4. do not try to have any private reference on the net_generic object. |
| 24 | * | 21 | * |
| @@ -46,6 +43,4 @@ static inline void *net_generic(struct net *net, int id) | |||
| 46 | 43 | ||
| 47 | return ptr; | 44 | return ptr; |
| 48 | } | 45 | } |
| 49 | |||
| 50 | extern int net_assign_generic(struct net *net, int id, void *data); | ||
| 51 | #endif | 46 | #endif |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 2764994c9136..d68c3f121774 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -55,19 +55,14 @@ struct netns_ipv4 { | |||
| 55 | int sysctl_rt_cache_rebuild_count; | 55 | int sysctl_rt_cache_rebuild_count; |
| 56 | int current_rt_cache_rebuild_count; | 56 | int current_rt_cache_rebuild_count; |
| 57 | 57 | ||
| 58 | struct timer_list rt_secret_timer; | ||
| 59 | atomic_t rt_genid; | 58 | atomic_t rt_genid; |
| 60 | 59 | ||
| 61 | #ifdef CONFIG_IP_MROUTE | 60 | #ifdef CONFIG_IP_MROUTE |
| 62 | struct sock *mroute_sk; | 61 | #ifndef CONFIG_IP_MROUTE_MULTIPLE_TABLES |
| 63 | struct mfc_cache **mfc_cache_array; | 62 | struct mr_table *mrt; |
| 64 | struct vif_device *vif_table; | 63 | #else |
| 65 | int maxvif; | 64 | struct list_head mr_tables; |
| 66 | atomic_t cache_resolve_queue_len; | 65 | struct fib_rules_ops *mr_rules_ops; |
| 67 | int mroute_do_assert; | ||
| 68 | int mroute_do_pim; | ||
| 69 | #if defined(CONFIG_IP_PIMSM_V1) || defined(CONFIG_IP_PIMSM_V2) | ||
| 70 | int mroute_reg_vif_num; | ||
| 71 | #endif | 66 | #endif |
| 72 | #endif | 67 | #endif |
| 73 | }; | 68 | }; |
diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h index 1f11ebc22151..81abfcb2eb4e 100644 --- a/include/net/netns/ipv6.h +++ b/include/net/netns/ipv6.h | |||
| @@ -59,15 +59,11 @@ struct netns_ipv6 { | |||
| 59 | struct sock *tcp_sk; | 59 | struct sock *tcp_sk; |
| 60 | struct sock *igmp_sk; | 60 | struct sock *igmp_sk; |
| 61 | #ifdef CONFIG_IPV6_MROUTE | 61 | #ifdef CONFIG_IPV6_MROUTE |
| 62 | struct sock *mroute6_sk; | 62 | #ifndef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES |
| 63 | struct mfc6_cache **mfc6_cache_array; | 63 | struct mr6_table *mrt6; |
| 64 | struct mif_device *vif6_table; | 64 | #else |
| 65 | int maxvif; | 65 | struct list_head mr6_tables; |
| 66 | atomic_t cache_resolve_queue_len; | 66 | struct fib_rules_ops *mr6_rules_ops; |
| 67 | int mroute_do_assert; | ||
| 68 | int mroute_do_pim; | ||
| 69 | #ifdef CONFIG_IPV6_PIMSM_V2 | ||
| 70 | int mroute_reg_vif_num; | ||
| 71 | #endif | 67 | #endif |
| 72 | #endif | 68 | #endif |
| 73 | }; | 69 | }; |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index b6cdc33b39c1..9d4d87cc970e 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
| @@ -12,7 +12,7 @@ struct qdisc_walker { | |||
| 12 | int (*fn)(struct Qdisc *, unsigned long cl, struct qdisc_walker *); | 12 | int (*fn)(struct Qdisc *, unsigned long cl, struct qdisc_walker *); |
| 13 | }; | 13 | }; |
| 14 | 14 | ||
| 15 | #define QDISC_ALIGNTO 32 | 15 | #define QDISC_ALIGNTO 64 |
| 16 | #define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1)) | 16 | #define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1)) |
| 17 | 17 | ||
| 18 | static inline void *qdisc_priv(struct Qdisc *q) | 18 | static inline void *qdisc_priv(struct Qdisc *q) |
diff --git a/include/net/raw.h b/include/net/raw.h index 6c14a656357a..43c57502659b 100644 --- a/include/net/raw.h +++ b/include/net/raw.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | #include <net/protocol.h> | 21 | #include <net/protocol.h> |
| 22 | #include <linux/icmp.h> | ||
| 22 | 23 | ||
| 23 | extern struct proto raw_prot; | 24 | extern struct proto raw_prot; |
| 24 | 25 | ||
| @@ -56,4 +57,16 @@ int raw_seq_open(struct inode *ino, struct file *file, | |||
| 56 | void raw_hash_sk(struct sock *sk); | 57 | void raw_hash_sk(struct sock *sk); |
| 57 | void raw_unhash_sk(struct sock *sk); | 58 | void raw_unhash_sk(struct sock *sk); |
| 58 | 59 | ||
| 60 | struct raw_sock { | ||
| 61 | /* inet_sock has to be the first member */ | ||
| 62 | struct inet_sock inet; | ||
| 63 | struct icmp_filter filter; | ||
| 64 | u32 ipmr_table; | ||
| 65 | }; | ||
| 66 | |||
| 67 | static inline struct raw_sock *raw_sk(const struct sock *sk) | ||
| 68 | { | ||
| 69 | return (struct raw_sock *)sk; | ||
| 70 | } | ||
| 71 | |||
| 59 | #endif /* _RAW_H */ | 72 | #endif /* _RAW_H */ |
diff --git a/include/net/route.h b/include/net/route.h index 2c9fba7f7731..af6cf4b4c9dc 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -112,7 +112,22 @@ extern void rt_cache_flush_batch(void); | |||
| 112 | extern int __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp); | 112 | extern int __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp); |
| 113 | extern int ip_route_output_key(struct net *, struct rtable **, struct flowi *flp); | 113 | extern int ip_route_output_key(struct net *, struct rtable **, struct flowi *flp); |
| 114 | extern int ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); | 114 | extern int ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); |
| 115 | extern int ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin); | 115 | |
| 116 | extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, | ||
| 117 | u8 tos, struct net_device *devin, bool noref); | ||
| 118 | |||
| 119 | static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src, | ||
| 120 | u8 tos, struct net_device *devin) | ||
| 121 | { | ||
| 122 | return ip_route_input_common(skb, dst, src, tos, devin, false); | ||
| 123 | } | ||
| 124 | |||
| 125 | static inline int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src, | ||
| 126 | u8 tos, struct net_device *devin) | ||
| 127 | { | ||
| 128 | return ip_route_input_common(skb, dst, src, tos, devin, true); | ||
| 129 | } | ||
| 130 | |||
| 116 | extern unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev); | 131 | extern unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev); |
| 117 | extern void ip_rt_send_redirect(struct sk_buff *skb); | 132 | extern void ip_rt_send_redirect(struct sk_buff *skb); |
| 118 | 133 | ||
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 67dc08eaaa45..03ca5d826757 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -73,6 +73,7 @@ struct Qdisc { | |||
| 73 | struct sk_buff_head q; | 73 | struct sk_buff_head q; |
| 74 | struct gnet_stats_basic_packed bstats; | 74 | struct gnet_stats_basic_packed bstats; |
| 75 | struct gnet_stats_queue qstats; | 75 | struct gnet_stats_queue qstats; |
| 76 | struct rcu_head rcu_head; | ||
| 76 | }; | 77 | }; |
| 77 | 78 | ||
| 78 | struct Qdisc_class_ops { | 79 | struct Qdisc_class_ops { |
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index fa6cde578a1d..65946bc43d00 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
| @@ -269,7 +269,7 @@ enum { | |||
| 269 | #define SCTP_MIB_MAX __SCTP_MIB_MAX | 269 | #define SCTP_MIB_MAX __SCTP_MIB_MAX |
| 270 | struct sctp_mib { | 270 | struct sctp_mib { |
| 271 | unsigned long mibs[SCTP_MIB_MAX]; | 271 | unsigned long mibs[SCTP_MIB_MAX]; |
| 272 | } __SNMP_MIB_ALIGN__; | 272 | }; |
| 273 | 273 | ||
| 274 | 274 | ||
| 275 | /* Print debugging messages. */ | 275 | /* Print debugging messages. */ |
| @@ -547,7 +547,7 @@ for (pos = chunk->subh.fwdtsn_hdr->skip;\ | |||
| 547 | #define WORD_ROUND(s) (((s)+3)&~3) | 547 | #define WORD_ROUND(s) (((s)+3)&~3) |
| 548 | 548 | ||
| 549 | /* Make a new instance of type. */ | 549 | /* Make a new instance of type. */ |
| 550 | #define t_new(type, flags) (type *)kmalloc(sizeof(type), flags) | 550 | #define t_new(type, flags) (type *)kzalloc(sizeof(type), flags) |
| 551 | 551 | ||
| 552 | /* Compare two timevals. */ | 552 | /* Compare two timevals. */ |
| 553 | #define tv_lt(s, t) \ | 553 | #define tv_lt(s, t) \ |
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 61d73e37d543..4088c89a9055 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
| @@ -438,7 +438,7 @@ sctp_vtag_verify_either(const struct sctp_chunk *chunk, | |||
| 438 | */ | 438 | */ |
| 439 | if ((!sctp_test_T_bit(chunk) && | 439 | if ((!sctp_test_T_bit(chunk) && |
| 440 | (ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag)) || | 440 | (ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag)) || |
| 441 | (sctp_test_T_bit(chunk) && | 441 | (sctp_test_T_bit(chunk) && asoc->c.peer_vtag && |
| 442 | (ntohl(chunk->sctp_hdr->vtag) == asoc->c.peer_vtag))) { | 442 | (ntohl(chunk->sctp_hdr->vtag) == asoc->c.peer_vtag))) { |
| 443 | return 1; | 443 | return 1; |
| 444 | } | 444 | } |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 219043a67bf7..6173c619913a 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -643,17 +643,15 @@ struct sctp_pf { | |||
| 643 | struct sctp_datamsg { | 643 | struct sctp_datamsg { |
| 644 | /* Chunks waiting to be submitted to lower layer. */ | 644 | /* Chunks waiting to be submitted to lower layer. */ |
| 645 | struct list_head chunks; | 645 | struct list_head chunks; |
| 646 | /* Chunks that have been transmitted. */ | ||
| 647 | size_t msg_size; | ||
| 648 | /* Reference counting. */ | 646 | /* Reference counting. */ |
| 649 | atomic_t refcnt; | 647 | atomic_t refcnt; |
| 650 | /* When is this message no longer interesting to the peer? */ | 648 | /* When is this message no longer interesting to the peer? */ |
| 651 | unsigned long expires_at; | 649 | unsigned long expires_at; |
| 652 | /* Did the messenge fail to send? */ | 650 | /* Did the messenge fail to send? */ |
| 653 | int send_error; | 651 | int send_error; |
| 654 | char send_failed; | 652 | u8 send_failed:1, |
| 655 | /* Control whether chunks from this message can be abandoned. */ | 653 | can_abandon:1, /* can chunks from this message can be abandoned. */ |
| 656 | char can_abandon; | 654 | can_delay; /* should this message be Nagle delayed */ |
| 657 | }; | 655 | }; |
| 658 | 656 | ||
| 659 | struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, | 657 | struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, |
| @@ -757,7 +755,6 @@ struct sctp_chunk { | |||
| 757 | #define SCTP_NEED_FRTX 0x1 | 755 | #define SCTP_NEED_FRTX 0x1 |
| 758 | #define SCTP_DONT_FRTX 0x2 | 756 | #define SCTP_DONT_FRTX 0x2 |
| 759 | __u16 rtt_in_progress:1, /* This chunk used for RTT calc? */ | 757 | __u16 rtt_in_progress:1, /* This chunk used for RTT calc? */ |
| 760 | resent:1, /* Has this chunk ever been resent. */ | ||
| 761 | has_tsn:1, /* Does this chunk have a TSN yet? */ | 758 | has_tsn:1, /* Does this chunk have a TSN yet? */ |
| 762 | has_ssn:1, /* Does this chunk have a SSN yet? */ | 759 | has_ssn:1, /* Does this chunk have a SSN yet? */ |
| 763 | singleton:1, /* Only chunk in the packet? */ | 760 | singleton:1, /* Only chunk in the packet? */ |
| @@ -879,7 +876,30 @@ struct sctp_transport { | |||
| 879 | 876 | ||
| 880 | /* Reference counting. */ | 877 | /* Reference counting. */ |
| 881 | atomic_t refcnt; | 878 | atomic_t refcnt; |
| 882 | int dead; | 879 | int dead:1, |
| 880 | /* RTO-Pending : A flag used to track if one of the DATA | ||
| 881 | * chunks sent to this address is currently being | ||
| 882 | * used to compute a RTT. If this flag is 0, | ||
| 883 | * the next DATA chunk sent to this destination | ||
| 884 | * should be used to compute a RTT and this flag | ||
| 885 | * should be set. Every time the RTT | ||
| 886 | * calculation completes (i.e. the DATA chunk | ||
| 887 | * is SACK'd) clear this flag. | ||
| 888 | */ | ||
| 889 | rto_pending:1, | ||
| 890 | |||
| 891 | /* | ||
| 892 | * hb_sent : a flag that signals that we have a pending | ||
| 893 | * heartbeat. | ||
| 894 | */ | ||
| 895 | hb_sent:1, | ||
| 896 | |||
| 897 | /* Is the Path MTU update pending on this tranport */ | ||
| 898 | pmtu_pending:1, | ||
| 899 | |||
| 900 | /* Is this structure kfree()able? */ | ||
| 901 | malloced:1; | ||
| 902 | |||
| 883 | 903 | ||
| 884 | /* This is the peer's IP address and port. */ | 904 | /* This is the peer's IP address and port. */ |
| 885 | union sctp_addr ipaddr; | 905 | union sctp_addr ipaddr; |
| @@ -909,22 +929,6 @@ struct sctp_transport { | |||
| 909 | /* SRTT : The current smoothed round trip time. */ | 929 | /* SRTT : The current smoothed round trip time. */ |
| 910 | __u32 srtt; | 930 | __u32 srtt; |
| 911 | 931 | ||
| 912 | /* RTO-Pending : A flag used to track if one of the DATA | ||
| 913 | * chunks sent to this address is currently being | ||
| 914 | * used to compute a RTT. If this flag is 0, | ||
| 915 | * the next DATA chunk sent to this destination | ||
| 916 | * should be used to compute a RTT and this flag | ||
| 917 | * should be set. Every time the RTT | ||
| 918 | * calculation completes (i.e. the DATA chunk | ||
| 919 | * is SACK'd) clear this flag. | ||
| 920 | * hb_sent : a flag that signals that we have a pending heartbeat. | ||
| 921 | */ | ||
| 922 | __u8 rto_pending; | ||
| 923 | __u8 hb_sent; | ||
| 924 | |||
| 925 | /* Flag to track the current fast recovery state */ | ||
| 926 | __u8 fast_recovery; | ||
| 927 | |||
| 928 | /* | 932 | /* |
| 929 | * These are the congestion stats. | 933 | * These are the congestion stats. |
| 930 | */ | 934 | */ |
| @@ -944,9 +948,6 @@ struct sctp_transport { | |||
| 944 | 948 | ||
| 945 | __u32 burst_limited; /* Holds old cwnd when max.burst is applied */ | 949 | __u32 burst_limited; /* Holds old cwnd when max.burst is applied */ |
| 946 | 950 | ||
| 947 | /* TSN marking the fast recovery exit point */ | ||
| 948 | __u32 fast_recovery_exit; | ||
| 949 | |||
| 950 | /* Destination */ | 951 | /* Destination */ |
| 951 | struct dst_entry *dst; | 952 | struct dst_entry *dst; |
| 952 | /* Source address. */ | 953 | /* Source address. */ |
| @@ -977,9 +978,6 @@ struct sctp_transport { | |||
| 977 | */ | 978 | */ |
| 978 | __u16 pathmaxrxt; | 979 | __u16 pathmaxrxt; |
| 979 | 980 | ||
| 980 | /* is the Path MTU update pending on this tranport */ | ||
| 981 | __u8 pmtu_pending; | ||
| 982 | |||
| 983 | /* PMTU : The current known path MTU. */ | 981 | /* PMTU : The current known path MTU. */ |
| 984 | __u32 pathmtu; | 982 | __u32 pathmtu; |
| 985 | 983 | ||
| @@ -1026,8 +1024,6 @@ struct sctp_transport { | |||
| 1026 | /* This is the list of transports that have chunks to send. */ | 1024 | /* This is the list of transports that have chunks to send. */ |
| 1027 | struct list_head send_ready; | 1025 | struct list_head send_ready; |
| 1028 | 1026 | ||
| 1029 | int malloced; /* Is this structure kfree()able? */ | ||
| 1030 | |||
| 1031 | /* State information saved for SFR_CACC algorithm. The key | 1027 | /* State information saved for SFR_CACC algorithm. The key |
| 1032 | * idea in SFR_CACC is to maintain state at the sender on a | 1028 | * idea in SFR_CACC is to maintain state at the sender on a |
| 1033 | * per-destination basis when a changeover happens. | 1029 | * per-destination basis when a changeover happens. |
| @@ -1069,7 +1065,7 @@ void sctp_transport_route(struct sctp_transport *, union sctp_addr *, | |||
| 1069 | struct sctp_sock *); | 1065 | struct sctp_sock *); |
| 1070 | void sctp_transport_pmtu(struct sctp_transport *); | 1066 | void sctp_transport_pmtu(struct sctp_transport *); |
| 1071 | void sctp_transport_free(struct sctp_transport *); | 1067 | void sctp_transport_free(struct sctp_transport *); |
| 1072 | void sctp_transport_reset_timers(struct sctp_transport *, int); | 1068 | void sctp_transport_reset_timers(struct sctp_transport *); |
| 1073 | void sctp_transport_hold(struct sctp_transport *); | 1069 | void sctp_transport_hold(struct sctp_transport *); |
| 1074 | void sctp_transport_put(struct sctp_transport *); | 1070 | void sctp_transport_put(struct sctp_transport *); |
| 1075 | void sctp_transport_update_rto(struct sctp_transport *, __u32); | 1071 | void sctp_transport_update_rto(struct sctp_transport *, __u32); |
| @@ -1723,6 +1719,12 @@ struct sctp_association { | |||
| 1723 | /* Highest TSN that is acknowledged by incoming SACKs. */ | 1719 | /* Highest TSN that is acknowledged by incoming SACKs. */ |
| 1724 | __u32 highest_sacked; | 1720 | __u32 highest_sacked; |
| 1725 | 1721 | ||
| 1722 | /* TSN marking the fast recovery exit point */ | ||
| 1723 | __u32 fast_recovery_exit; | ||
| 1724 | |||
| 1725 | /* Flag to track the current fast recovery state */ | ||
| 1726 | __u8 fast_recovery; | ||
| 1727 | |||
| 1726 | /* The number of unacknowledged data chunks. Reported through | 1728 | /* The number of unacknowledged data chunks. Reported through |
| 1727 | * the SCTP_STATUS sockopt. | 1729 | * the SCTP_STATUS sockopt. |
| 1728 | */ | 1730 | */ |
diff --git a/include/net/snmp.h b/include/net/snmp.h index 692ee0061dc4..92456f1035f5 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h | |||
| @@ -52,26 +52,11 @@ struct snmp_mib { | |||
| 52 | * count on the 20Gb/s + networks people expect in a few years time! | 52 | * count on the 20Gb/s + networks people expect in a few years time! |
| 53 | */ | 53 | */ |
| 54 | 54 | ||
| 55 | /* | ||
| 56 | * The rule for padding: | ||
| 57 | * Best is power of two because then the right structure can be found by a | ||
| 58 | * simple shift. The structure should be always cache line aligned. | ||
| 59 | * gcc needs n=alignto(cachelinesize, popcnt(sizeof(bla_mib))) shift/add | ||
| 60 | * instructions to emulate multiply in case it is not power-of-two. | ||
| 61 | * Currently n is always <=3 for all sizes so simple cache line alignment | ||
| 62 | * is enough. | ||
| 63 | * | ||
| 64 | * The best solution would be a global CPU local area , especially on 64 | ||
| 65 | * and 128byte cacheline machine it makes a *lot* of sense -AK | ||
| 66 | */ | ||
| 67 | |||
| 68 | #define __SNMP_MIB_ALIGN__ ____cacheline_aligned | ||
| 69 | |||
| 70 | /* IPstats */ | 55 | /* IPstats */ |
| 71 | #define IPSTATS_MIB_MAX __IPSTATS_MIB_MAX | 56 | #define IPSTATS_MIB_MAX __IPSTATS_MIB_MAX |
| 72 | struct ipstats_mib { | 57 | struct ipstats_mib { |
| 73 | unsigned long mibs[IPSTATS_MIB_MAX]; | 58 | unsigned long mibs[IPSTATS_MIB_MAX]; |
| 74 | } __SNMP_MIB_ALIGN__; | 59 | }; |
| 75 | 60 | ||
| 76 | /* ICMP */ | 61 | /* ICMP */ |
| 77 | #define ICMP_MIB_DUMMY __ICMP_MIB_MAX | 62 | #define ICMP_MIB_DUMMY __ICMP_MIB_MAX |
| @@ -79,36 +64,36 @@ struct ipstats_mib { | |||
| 79 | 64 | ||
| 80 | struct icmp_mib { | 65 | struct icmp_mib { |
| 81 | unsigned long mibs[ICMP_MIB_MAX]; | 66 | unsigned long mibs[ICMP_MIB_MAX]; |
| 82 | } __SNMP_MIB_ALIGN__; | 67 | }; |
| 83 | 68 | ||
| 84 | #define ICMPMSG_MIB_MAX __ICMPMSG_MIB_MAX | 69 | #define ICMPMSG_MIB_MAX __ICMPMSG_MIB_MAX |
| 85 | struct icmpmsg_mib { | 70 | struct icmpmsg_mib { |
| 86 | unsigned long mibs[ICMPMSG_MIB_MAX]; | 71 | unsigned long mibs[ICMPMSG_MIB_MAX]; |
| 87 | } __SNMP_MIB_ALIGN__; | 72 | }; |
| 88 | 73 | ||
| 89 | /* ICMP6 (IPv6-ICMP) */ | 74 | /* ICMP6 (IPv6-ICMP) */ |
| 90 | #define ICMP6_MIB_MAX __ICMP6_MIB_MAX | 75 | #define ICMP6_MIB_MAX __ICMP6_MIB_MAX |
| 91 | struct icmpv6_mib { | 76 | struct icmpv6_mib { |
| 92 | unsigned long mibs[ICMP6_MIB_MAX]; | 77 | unsigned long mibs[ICMP6_MIB_MAX]; |
| 93 | } __SNMP_MIB_ALIGN__; | 78 | }; |
| 94 | 79 | ||
| 95 | #define ICMP6MSG_MIB_MAX __ICMP6MSG_MIB_MAX | 80 | #define ICMP6MSG_MIB_MAX __ICMP6MSG_MIB_MAX |
| 96 | struct icmpv6msg_mib { | 81 | struct icmpv6msg_mib { |
| 97 | unsigned long mibs[ICMP6MSG_MIB_MAX]; | 82 | unsigned long mibs[ICMP6MSG_MIB_MAX]; |
| 98 | } __SNMP_MIB_ALIGN__; | 83 | }; |
| 99 | 84 | ||
| 100 | 85 | ||
| 101 | /* TCP */ | 86 | /* TCP */ |
| 102 | #define TCP_MIB_MAX __TCP_MIB_MAX | 87 | #define TCP_MIB_MAX __TCP_MIB_MAX |
| 103 | struct tcp_mib { | 88 | struct tcp_mib { |
| 104 | unsigned long mibs[TCP_MIB_MAX]; | 89 | unsigned long mibs[TCP_MIB_MAX]; |
| 105 | } __SNMP_MIB_ALIGN__; | 90 | }; |
| 106 | 91 | ||
| 107 | /* UDP */ | 92 | /* UDP */ |
| 108 | #define UDP_MIB_MAX __UDP_MIB_MAX | 93 | #define UDP_MIB_MAX __UDP_MIB_MAX |
| 109 | struct udp_mib { | 94 | struct udp_mib { |
| 110 | unsigned long mibs[UDP_MIB_MAX]; | 95 | unsigned long mibs[UDP_MIB_MAX]; |
| 111 | } __SNMP_MIB_ALIGN__; | 96 | }; |
| 112 | 97 | ||
| 113 | /* Linux */ | 98 | /* Linux */ |
| 114 | #define LINUX_MIB_MAX __LINUX_MIB_MAX | 99 | #define LINUX_MIB_MAX __LINUX_MIB_MAX |
| @@ -148,6 +133,8 @@ struct linux_xfrm_mib { | |||
| 148 | __this_cpu_add(mib[0]->mibs[field], addend) | 133 | __this_cpu_add(mib[0]->mibs[field], addend) |
| 149 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ | 134 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ |
| 150 | this_cpu_add(mib[1]->mibs[field], addend) | 135 | this_cpu_add(mib[1]->mibs[field], addend) |
| 136 | #define SNMP_ADD_STATS(mib, field, addend) \ | ||
| 137 | this_cpu_add(mib[0]->mibs[field], addend) | ||
| 151 | /* | 138 | /* |
| 152 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" | 139 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" |
| 153 | * to make @ptr a non-percpu pointer. | 140 | * to make @ptr a non-percpu pointer. |
diff --git a/include/net/sock.h b/include/net/sock.h index 1ad6435f252e..5697caf8cc76 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -159,7 +159,7 @@ struct sock_common { | |||
| 159 | * @sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings | 159 | * @sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings |
| 160 | * @sk_lock: synchronizer | 160 | * @sk_lock: synchronizer |
| 161 | * @sk_rcvbuf: size of receive buffer in bytes | 161 | * @sk_rcvbuf: size of receive buffer in bytes |
| 162 | * @sk_sleep: sock wait queue | 162 | * @sk_wq: sock wait queue and async head |
| 163 | * @sk_dst_cache: destination cache | 163 | * @sk_dst_cache: destination cache |
| 164 | * @sk_dst_lock: destination cache lock | 164 | * @sk_dst_lock: destination cache lock |
| 165 | * @sk_policy: flow policy | 165 | * @sk_policy: flow policy |
| @@ -177,6 +177,7 @@ struct sock_common { | |||
| 177 | * %SO_OOBINLINE settings, %SO_TIMESTAMPING settings | 177 | * %SO_OOBINLINE settings, %SO_TIMESTAMPING settings |
| 178 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets | 178 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets |
| 179 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) | 179 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) |
| 180 | * @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) | ||
| 180 | * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) | 181 | * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) |
| 181 | * @sk_gso_max_size: Maximum GSO segment size to build | 182 | * @sk_gso_max_size: Maximum GSO segment size to build |
| 182 | * @sk_lingertime: %SO_LINGER l_linger setting | 183 | * @sk_lingertime: %SO_LINGER l_linger setting |
| @@ -198,6 +199,7 @@ struct sock_common { | |||
| 198 | * @sk_rcvlowat: %SO_RCVLOWAT setting | 199 | * @sk_rcvlowat: %SO_RCVLOWAT setting |
| 199 | * @sk_rcvtimeo: %SO_RCVTIMEO setting | 200 | * @sk_rcvtimeo: %SO_RCVTIMEO setting |
| 200 | * @sk_sndtimeo: %SO_SNDTIMEO setting | 201 | * @sk_sndtimeo: %SO_SNDTIMEO setting |
| 202 | * @sk_rxhash: flow hash received from netif layer | ||
| 201 | * @sk_filter: socket filtering instructions | 203 | * @sk_filter: socket filtering instructions |
| 202 | * @sk_protinfo: private area, net family specific, when not using slab | 204 | * @sk_protinfo: private area, net family specific, when not using slab |
| 203 | * @sk_timer: sock cleanup timer | 205 | * @sk_timer: sock cleanup timer |
| @@ -255,14 +257,13 @@ struct sock { | |||
| 255 | struct sk_buff *head; | 257 | struct sk_buff *head; |
| 256 | struct sk_buff *tail; | 258 | struct sk_buff *tail; |
| 257 | int len; | 259 | int len; |
| 258 | int limit; | ||
| 259 | } sk_backlog; | 260 | } sk_backlog; |
| 260 | wait_queue_head_t *sk_sleep; | 261 | struct socket_wq *sk_wq; |
| 261 | struct dst_entry *sk_dst_cache; | 262 | struct dst_entry *sk_dst_cache; |
| 262 | #ifdef CONFIG_XFRM | 263 | #ifdef CONFIG_XFRM |
| 263 | struct xfrm_policy *sk_policy[2]; | 264 | struct xfrm_policy *sk_policy[2]; |
| 264 | #endif | 265 | #endif |
| 265 | rwlock_t sk_dst_lock; | 266 | spinlock_t sk_dst_lock; |
| 266 | atomic_t sk_rmem_alloc; | 267 | atomic_t sk_rmem_alloc; |
| 267 | atomic_t sk_wmem_alloc; | 268 | atomic_t sk_wmem_alloc; |
| 268 | atomic_t sk_omem_alloc; | 269 | atomic_t sk_omem_alloc; |
| @@ -276,9 +277,13 @@ struct sock { | |||
| 276 | int sk_forward_alloc; | 277 | int sk_forward_alloc; |
| 277 | gfp_t sk_allocation; | 278 | gfp_t sk_allocation; |
| 278 | int sk_route_caps; | 279 | int sk_route_caps; |
| 280 | int sk_route_nocaps; | ||
| 279 | int sk_gso_type; | 281 | int sk_gso_type; |
| 280 | unsigned int sk_gso_max_size; | 282 | unsigned int sk_gso_max_size; |
| 281 | int sk_rcvlowat; | 283 | int sk_rcvlowat; |
| 284 | #ifdef CONFIG_RPS | ||
| 285 | __u32 sk_rxhash; | ||
| 286 | #endif | ||
| 282 | unsigned long sk_flags; | 287 | unsigned long sk_flags; |
| 283 | unsigned long sk_lingertime; | 288 | unsigned long sk_lingertime; |
| 284 | struct sk_buff_head sk_error_queue; | 289 | struct sk_buff_head sk_error_queue; |
| @@ -595,19 +600,32 @@ static inline int sk_stream_memory_free(struct sock *sk) | |||
| 595 | /* OOB backlog add */ | 600 | /* OOB backlog add */ |
| 596 | static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) | 601 | static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
| 597 | { | 602 | { |
| 598 | if (!sk->sk_backlog.tail) { | 603 | /* dont let skb dst not refcounted, we are going to leave rcu lock */ |
| 599 | sk->sk_backlog.head = sk->sk_backlog.tail = skb; | 604 | skb_dst_force(skb); |
| 600 | } else { | 605 | |
| 606 | if (!sk->sk_backlog.tail) | ||
| 607 | sk->sk_backlog.head = skb; | ||
| 608 | else | ||
| 601 | sk->sk_backlog.tail->next = skb; | 609 | sk->sk_backlog.tail->next = skb; |
| 602 | sk->sk_backlog.tail = skb; | 610 | |
| 603 | } | 611 | sk->sk_backlog.tail = skb; |
| 604 | skb->next = NULL; | 612 | skb->next = NULL; |
| 605 | } | 613 | } |
| 606 | 614 | ||
| 615 | /* | ||
| 616 | * Take into account size of receive queue and backlog queue | ||
| 617 | */ | ||
| 618 | static inline bool sk_rcvqueues_full(const struct sock *sk, const struct sk_buff *skb) | ||
| 619 | { | ||
| 620 | unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); | ||
| 621 | |||
| 622 | return qsize + skb->truesize > sk->sk_rcvbuf; | ||
| 623 | } | ||
| 624 | |||
| 607 | /* The per-socket spinlock must be held here. */ | 625 | /* The per-socket spinlock must be held here. */ |
| 608 | static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb) | 626 | static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
| 609 | { | 627 | { |
| 610 | if (sk->sk_backlog.len >= max(sk->sk_backlog.limit, sk->sk_rcvbuf << 1)) | 628 | if (sk_rcvqueues_full(sk, skb)) |
| 611 | return -ENOBUFS; | 629 | return -ENOBUFS; |
| 612 | 630 | ||
| 613 | __sk_add_backlog(sk, skb); | 631 | __sk_add_backlog(sk, skb); |
| @@ -620,6 +638,40 @@ static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 620 | return sk->sk_backlog_rcv(sk, skb); | 638 | return sk->sk_backlog_rcv(sk, skb); |
| 621 | } | 639 | } |
| 622 | 640 | ||
| 641 | static inline void sock_rps_record_flow(const struct sock *sk) | ||
| 642 | { | ||
| 643 | #ifdef CONFIG_RPS | ||
| 644 | struct rps_sock_flow_table *sock_flow_table; | ||
| 645 | |||
| 646 | rcu_read_lock(); | ||
| 647 | sock_flow_table = rcu_dereference(rps_sock_flow_table); | ||
| 648 | rps_record_sock_flow(sock_flow_table, sk->sk_rxhash); | ||
| 649 | rcu_read_unlock(); | ||
| 650 | #endif | ||
| 651 | } | ||
| 652 | |||
| 653 | static inline void sock_rps_reset_flow(const struct sock *sk) | ||
| 654 | { | ||
| 655 | #ifdef CONFIG_RPS | ||
| 656 | struct rps_sock_flow_table *sock_flow_table; | ||
| 657 | |||
| 658 | rcu_read_lock(); | ||
| 659 | sock_flow_table = rcu_dereference(rps_sock_flow_table); | ||
| 660 | rps_reset_sock_flow(sock_flow_table, sk->sk_rxhash); | ||
| 661 | rcu_read_unlock(); | ||
| 662 | #endif | ||
| 663 | } | ||
| 664 | |||
| 665 | static inline void sock_rps_save_rxhash(struct sock *sk, u32 rxhash) | ||
| 666 | { | ||
| 667 | #ifdef CONFIG_RPS | ||
| 668 | if (unlikely(sk->sk_rxhash != rxhash)) { | ||
| 669 | sock_rps_reset_flow(sk); | ||
| 670 | sk->sk_rxhash = rxhash; | ||
| 671 | } | ||
| 672 | #endif | ||
| 673 | } | ||
| 674 | |||
| 623 | #define sk_wait_event(__sk, __timeo, __condition) \ | 675 | #define sk_wait_event(__sk, __timeo, __condition) \ |
| 624 | ({ int __rc; \ | 676 | ({ int __rc; \ |
| 625 | release_sock(__sk); \ | 677 | release_sock(__sk); \ |
| @@ -974,6 +1026,16 @@ extern void release_sock(struct sock *sk); | |||
| 974 | SINGLE_DEPTH_NESTING) | 1026 | SINGLE_DEPTH_NESTING) |
| 975 | #define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) | 1027 | #define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) |
| 976 | 1028 | ||
| 1029 | static inline void lock_sock_bh(struct sock *sk) | ||
| 1030 | { | ||
| 1031 | spin_lock_bh(&sk->sk_lock.slock); | ||
| 1032 | } | ||
| 1033 | |||
| 1034 | static inline void unlock_sock_bh(struct sock *sk) | ||
| 1035 | { | ||
| 1036 | spin_unlock_bh(&sk->sk_lock.slock); | ||
| 1037 | } | ||
| 1038 | |||
| 977 | extern struct sock *sk_alloc(struct net *net, int family, | 1039 | extern struct sock *sk_alloc(struct net *net, int family, |
| 978 | gfp_t priority, | 1040 | gfp_t priority, |
| 979 | struct proto *prot); | 1041 | struct proto *prot); |
| @@ -1160,6 +1222,10 @@ static inline void sk_set_socket(struct sock *sk, struct socket *sock) | |||
| 1160 | sk->sk_socket = sock; | 1222 | sk->sk_socket = sock; |
| 1161 | } | 1223 | } |
| 1162 | 1224 | ||
| 1225 | static inline wait_queue_head_t *sk_sleep(struct sock *sk) | ||
| 1226 | { | ||
| 1227 | return &sk->sk_wq->wait; | ||
| 1228 | } | ||
| 1163 | /* Detach socket from process context. | 1229 | /* Detach socket from process context. |
| 1164 | * Announce socket dead, detach it from wait queue and inode. | 1230 | * Announce socket dead, detach it from wait queue and inode. |
| 1165 | * Note that parent inode held reference count on this struct sock, | 1231 | * Note that parent inode held reference count on this struct sock, |
| @@ -1172,14 +1238,14 @@ static inline void sock_orphan(struct sock *sk) | |||
| 1172 | write_lock_bh(&sk->sk_callback_lock); | 1238 | write_lock_bh(&sk->sk_callback_lock); |
| 1173 | sock_set_flag(sk, SOCK_DEAD); | 1239 | sock_set_flag(sk, SOCK_DEAD); |
| 1174 | sk_set_socket(sk, NULL); | 1240 | sk_set_socket(sk, NULL); |
| 1175 | sk->sk_sleep = NULL; | 1241 | sk->sk_wq = NULL; |
| 1176 | write_unlock_bh(&sk->sk_callback_lock); | 1242 | write_unlock_bh(&sk->sk_callback_lock); |
| 1177 | } | 1243 | } |
| 1178 | 1244 | ||
| 1179 | static inline void sock_graft(struct sock *sk, struct socket *parent) | 1245 | static inline void sock_graft(struct sock *sk, struct socket *parent) |
| 1180 | { | 1246 | { |
| 1181 | write_lock_bh(&sk->sk_callback_lock); | 1247 | write_lock_bh(&sk->sk_callback_lock); |
| 1182 | sk->sk_sleep = &parent->wait; | 1248 | rcu_assign_pointer(sk->sk_wq, parent->wq); |
| 1183 | parent->sk = sk; | 1249 | parent->sk = sk; |
| 1184 | sk_set_socket(sk, parent); | 1250 | sk_set_socket(sk, parent); |
| 1185 | security_sock_graft(sk, parent); | 1251 | security_sock_graft(sk, parent); |
| @@ -1192,7 +1258,9 @@ extern unsigned long sock_i_ino(struct sock *sk); | |||
| 1192 | static inline struct dst_entry * | 1258 | static inline struct dst_entry * |
| 1193 | __sk_dst_get(struct sock *sk) | 1259 | __sk_dst_get(struct sock *sk) |
| 1194 | { | 1260 | { |
| 1195 | return sk->sk_dst_cache; | 1261 | return rcu_dereference_check(sk->sk_dst_cache, rcu_read_lock_held() || |
| 1262 | sock_owned_by_user(sk) || | ||
| 1263 | lockdep_is_held(&sk->sk_lock.slock)); | ||
| 1196 | } | 1264 | } |
| 1197 | 1265 | ||
| 1198 | static inline struct dst_entry * | 1266 | static inline struct dst_entry * |
| @@ -1200,50 +1268,65 @@ sk_dst_get(struct sock *sk) | |||
| 1200 | { | 1268 | { |
| 1201 | struct dst_entry *dst; | 1269 | struct dst_entry *dst; |
| 1202 | 1270 | ||
| 1203 | read_lock(&sk->sk_dst_lock); | 1271 | rcu_read_lock(); |
| 1204 | dst = sk->sk_dst_cache; | 1272 | dst = rcu_dereference(sk->sk_dst_cache); |
| 1205 | if (dst) | 1273 | if (dst) |
| 1206 | dst_hold(dst); | 1274 | dst_hold(dst); |
| 1207 | read_unlock(&sk->sk_dst_lock); | 1275 | rcu_read_unlock(); |
| 1208 | return dst; | 1276 | return dst; |
| 1209 | } | 1277 | } |
| 1210 | 1278 | ||
| 1279 | extern void sk_reset_txq(struct sock *sk); | ||
| 1280 | |||
| 1281 | static inline void dst_negative_advice(struct sock *sk) | ||
| 1282 | { | ||
| 1283 | struct dst_entry *ndst, *dst = __sk_dst_get(sk); | ||
| 1284 | |||
| 1285 | if (dst && dst->ops->negative_advice) { | ||
| 1286 | ndst = dst->ops->negative_advice(dst); | ||
| 1287 | |||
| 1288 | if (ndst != dst) { | ||
| 1289 | rcu_assign_pointer(sk->sk_dst_cache, ndst); | ||
| 1290 | sk_reset_txq(sk); | ||
| 1291 | } | ||
| 1292 | } | ||
| 1293 | } | ||
| 1294 | |||
| 1211 | static inline void | 1295 | static inline void |
| 1212 | __sk_dst_set(struct sock *sk, struct dst_entry *dst) | 1296 | __sk_dst_set(struct sock *sk, struct dst_entry *dst) |
| 1213 | { | 1297 | { |
| 1214 | struct dst_entry *old_dst; | 1298 | struct dst_entry *old_dst; |
| 1215 | 1299 | ||
| 1216 | sk_tx_queue_clear(sk); | 1300 | sk_tx_queue_clear(sk); |
| 1217 | old_dst = sk->sk_dst_cache; | 1301 | /* |
| 1218 | sk->sk_dst_cache = dst; | 1302 | * This can be called while sk is owned by the caller only, |
| 1303 | * with no state that can be checked in a rcu_dereference_check() cond | ||
| 1304 | */ | ||
| 1305 | old_dst = rcu_dereference_raw(sk->sk_dst_cache); | ||
| 1306 | rcu_assign_pointer(sk->sk_dst_cache, dst); | ||
| 1219 | dst_release(old_dst); | 1307 | dst_release(old_dst); |
| 1220 | } | 1308 | } |
| 1221 | 1309 | ||
| 1222 | static inline void | 1310 | static inline void |
| 1223 | sk_dst_set(struct sock *sk, struct dst_entry *dst) | 1311 | sk_dst_set(struct sock *sk, struct dst_entry *dst) |
| 1224 | { | 1312 | { |
| 1225 | write_lock(&sk->sk_dst_lock); | 1313 | spin_lock(&sk->sk_dst_lock); |
| 1226 | __sk_dst_set(sk, dst); | 1314 | __sk_dst_set(sk, dst); |
| 1227 | write_unlock(&sk->sk_dst_lock); | 1315 | spin_unlock(&sk->sk_dst_lock); |
| 1228 | } | 1316 | } |
| 1229 | 1317 | ||
| 1230 | static inline void | 1318 | static inline void |
| 1231 | __sk_dst_reset(struct sock *sk) | 1319 | __sk_dst_reset(struct sock *sk) |
| 1232 | { | 1320 | { |
| 1233 | struct dst_entry *old_dst; | 1321 | __sk_dst_set(sk, NULL); |
| 1234 | |||
| 1235 | sk_tx_queue_clear(sk); | ||
| 1236 | old_dst = sk->sk_dst_cache; | ||
| 1237 | sk->sk_dst_cache = NULL; | ||
| 1238 | dst_release(old_dst); | ||
| 1239 | } | 1322 | } |
| 1240 | 1323 | ||
| 1241 | static inline void | 1324 | static inline void |
| 1242 | sk_dst_reset(struct sock *sk) | 1325 | sk_dst_reset(struct sock *sk) |
| 1243 | { | 1326 | { |
| 1244 | write_lock(&sk->sk_dst_lock); | 1327 | spin_lock(&sk->sk_dst_lock); |
| 1245 | __sk_dst_reset(sk); | 1328 | __sk_dst_reset(sk); |
| 1246 | write_unlock(&sk->sk_dst_lock); | 1329 | spin_unlock(&sk->sk_dst_lock); |
| 1247 | } | 1330 | } |
| 1248 | 1331 | ||
| 1249 | extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); | 1332 | extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); |
| @@ -1257,6 +1340,12 @@ static inline int sk_can_gso(const struct sock *sk) | |||
| 1257 | 1340 | ||
| 1258 | extern void sk_setup_caps(struct sock *sk, struct dst_entry *dst); | 1341 | extern void sk_setup_caps(struct sock *sk, struct dst_entry *dst); |
| 1259 | 1342 | ||
| 1343 | static inline void sk_nocaps_add(struct sock *sk, int flags) | ||
| 1344 | { | ||
| 1345 | sk->sk_route_nocaps |= flags; | ||
| 1346 | sk->sk_route_caps &= ~flags; | ||
| 1347 | } | ||
| 1348 | |||
| 1260 | static inline int skb_copy_to_page(struct sock *sk, char __user *from, | 1349 | static inline int skb_copy_to_page(struct sock *sk, char __user *from, |
| 1261 | struct sk_buff *skb, struct page *page, | 1350 | struct sk_buff *skb, struct page *page, |
| 1262 | int off, int copy) | 1351 | int off, int copy) |
| @@ -1314,12 +1403,12 @@ static inline int sk_has_allocations(const struct sock *sk) | |||
| 1314 | } | 1403 | } |
| 1315 | 1404 | ||
| 1316 | /** | 1405 | /** |
| 1317 | * sk_has_sleeper - check if there are any waiting processes | 1406 | * wq_has_sleeper - check if there are any waiting processes |
| 1318 | * @sk: socket | 1407 | * @sk: struct socket_wq |
| 1319 | * | 1408 | * |
| 1320 | * Returns true if socket has waiting processes | 1409 | * Returns true if socket_wq has waiting processes |
| 1321 | * | 1410 | * |
| 1322 | * The purpose of the sk_has_sleeper and sock_poll_wait is to wrap the memory | 1411 | * The purpose of the wq_has_sleeper and sock_poll_wait is to wrap the memory |
| 1323 | * barrier call. They were added due to the race found within the tcp code. | 1412 | * barrier call. They were added due to the race found within the tcp code. |
| 1324 | * | 1413 | * |
| 1325 | * Consider following tcp code paths: | 1414 | * Consider following tcp code paths: |
| @@ -1332,9 +1421,10 @@ static inline int sk_has_allocations(const struct sock *sk) | |||
| 1332 | * ... ... | 1421 | * ... ... |
| 1333 | * tp->rcv_nxt check sock_def_readable | 1422 | * tp->rcv_nxt check sock_def_readable |
| 1334 | * ... { | 1423 | * ... { |
| 1335 | * schedule ... | 1424 | * schedule rcu_read_lock(); |
| 1336 | * if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 1425 | * wq = rcu_dereference(sk->sk_wq); |
| 1337 | * wake_up_interruptible(sk->sk_sleep) | 1426 | * if (wq && waitqueue_active(&wq->wait)) |
| 1427 | * wake_up_interruptible(&wq->wait) | ||
| 1338 | * ... | 1428 | * ... |
| 1339 | * } | 1429 | * } |
| 1340 | * | 1430 | * |
| @@ -1343,19 +1433,18 @@ static inline int sk_has_allocations(const struct sock *sk) | |||
| 1343 | * could then endup calling schedule and sleep forever if there are no more | 1433 | * could then endup calling schedule and sleep forever if there are no more |
| 1344 | * data on the socket. | 1434 | * data on the socket. |
| 1345 | * | 1435 | * |
| 1346 | * The sk_has_sleeper is always called right after a call to read_lock, so we | ||
| 1347 | * can use smp_mb__after_lock barrier. | ||
| 1348 | */ | 1436 | */ |
| 1349 | static inline int sk_has_sleeper(struct sock *sk) | 1437 | static inline bool wq_has_sleeper(struct socket_wq *wq) |
| 1350 | { | 1438 | { |
| 1439 | |||
| 1351 | /* | 1440 | /* |
| 1352 | * We need to be sure we are in sync with the | 1441 | * We need to be sure we are in sync with the |
| 1353 | * add_wait_queue modifications to the wait queue. | 1442 | * add_wait_queue modifications to the wait queue. |
| 1354 | * | 1443 | * |
| 1355 | * This memory barrier is paired in the sock_poll_wait. | 1444 | * This memory barrier is paired in the sock_poll_wait. |
| 1356 | */ | 1445 | */ |
| 1357 | smp_mb__after_lock(); | 1446 | smp_mb(); |
| 1358 | return sk->sk_sleep && waitqueue_active(sk->sk_sleep); | 1447 | return wq && waitqueue_active(&wq->wait); |
| 1359 | } | 1448 | } |
| 1360 | 1449 | ||
| 1361 | /** | 1450 | /** |
| @@ -1364,7 +1453,7 @@ static inline int sk_has_sleeper(struct sock *sk) | |||
| 1364 | * @wait_address: socket wait queue | 1453 | * @wait_address: socket wait queue |
| 1365 | * @p: poll_table | 1454 | * @p: poll_table |
| 1366 | * | 1455 | * |
| 1367 | * See the comments in the sk_has_sleeper function. | 1456 | * See the comments in the wq_has_sleeper function. |
| 1368 | */ | 1457 | */ |
| 1369 | static inline void sock_poll_wait(struct file *filp, | 1458 | static inline void sock_poll_wait(struct file *filp, |
| 1370 | wait_queue_head_t *wait_address, poll_table *p) | 1459 | wait_queue_head_t *wait_address, poll_table *p) |
| @@ -1375,7 +1464,7 @@ static inline void sock_poll_wait(struct file *filp, | |||
| 1375 | * We need to be sure we are in sync with the | 1464 | * We need to be sure we are in sync with the |
| 1376 | * socket flags modification. | 1465 | * socket flags modification. |
| 1377 | * | 1466 | * |
| 1378 | * This memory barrier is paired in the sk_has_sleeper. | 1467 | * This memory barrier is paired in the wq_has_sleeper. |
| 1379 | */ | 1468 | */ |
| 1380 | smp_mb(); | 1469 | smp_mb(); |
| 1381 | } | 1470 | } |
| @@ -1557,7 +1646,24 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) | |||
| 1557 | sk->sk_stamp = kt; | 1646 | sk->sk_stamp = kt; |
| 1558 | } | 1647 | } |
| 1559 | 1648 | ||
| 1560 | extern void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb); | 1649 | extern void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, |
| 1650 | struct sk_buff *skb); | ||
| 1651 | |||
| 1652 | static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, | ||
| 1653 | struct sk_buff *skb) | ||
| 1654 | { | ||
| 1655 | #define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \ | ||
| 1656 | (1UL << SOCK_RCVTSTAMP) | \ | ||
| 1657 | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE) | \ | ||
| 1658 | (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \ | ||
| 1659 | (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE) | \ | ||
| 1660 | (1UL << SOCK_TIMESTAMPING_SYS_HARDWARE)) | ||
| 1661 | |||
| 1662 | if (sk->sk_flags & FLAGS_TS_OR_DROPS) | ||
| 1663 | __sock_recv_ts_and_drops(msg, sk, skb); | ||
| 1664 | else | ||
| 1665 | sk->sk_stamp = skb->tstamp; | ||
| 1666 | } | ||
| 1561 | 1667 | ||
| 1562 | /** | 1668 | /** |
| 1563 | * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped | 1669 | * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped |
diff --git a/include/net/tcp.h b/include/net/tcp.h index aa04b9a5093b..a1449144848a 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -294,6 +294,7 @@ extern struct proto tcp_prot; | |||
| 294 | #define TCP_INC_STATS_BH(net, field) SNMP_INC_STATS_BH((net)->mib.tcp_statistics, field) | 294 | #define TCP_INC_STATS_BH(net, field) SNMP_INC_STATS_BH((net)->mib.tcp_statistics, field) |
| 295 | #define TCP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->mib.tcp_statistics, field) | 295 | #define TCP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->mib.tcp_statistics, field) |
| 296 | #define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val) | 296 | #define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val) |
| 297 | #define TCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val) | ||
| 297 | 298 | ||
| 298 | extern void tcp_v4_err(struct sk_buff *skb, u32); | 299 | extern void tcp_v4_err(struct sk_buff *skb, u32); |
| 299 | 300 | ||
| @@ -423,7 +424,7 @@ extern u8 *tcp_parse_md5sig_option(struct tcphdr *th); | |||
| 423 | * TCP v4 functions exported for the inet6 API | 424 | * TCP v4 functions exported for the inet6 API |
| 424 | */ | 425 | */ |
| 425 | 426 | ||
| 426 | extern void tcp_v4_send_check(struct sock *sk, int len, | 427 | extern void tcp_v4_send_check(struct sock *sk, |
| 427 | struct sk_buff *skb); | 428 | struct sk_buff *skb); |
| 428 | 429 | ||
| 429 | extern int tcp_v4_conn_request(struct sock *sk, | 430 | extern int tcp_v4_conn_request(struct sock *sk, |
| @@ -939,7 +940,7 @@ static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb) | |||
| 939 | 940 | ||
| 940 | tp->ucopy.memory = 0; | 941 | tp->ucopy.memory = 0; |
| 941 | } else if (skb_queue_len(&tp->ucopy.prequeue) == 1) { | 942 | } else if (skb_queue_len(&tp->ucopy.prequeue) == 1) { |
| 942 | wake_up_interruptible_sync_poll(sk->sk_sleep, | 943 | wake_up_interruptible_sync_poll(sk_sleep(sk), |
| 943 | POLLIN | POLLRDNORM | POLLRDBAND); | 944 | POLLIN | POLLRDNORM | POLLRDBAND); |
| 944 | if (!inet_csk_ack_scheduled(sk)) | 945 | if (!inet_csk_ack_scheduled(sk)) |
| 945 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, | 946 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
| @@ -1032,6 +1033,14 @@ static inline int keepalive_probes(const struct tcp_sock *tp) | |||
| 1032 | return tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; | 1033 | return tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; |
| 1033 | } | 1034 | } |
| 1034 | 1035 | ||
| 1036 | static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp) | ||
| 1037 | { | ||
| 1038 | const struct inet_connection_sock *icsk = &tp->inet_conn; | ||
| 1039 | |||
| 1040 | return min_t(u32, tcp_time_stamp - icsk->icsk_ack.lrcvtime, | ||
| 1041 | tcp_time_stamp - tp->rcv_tstamp); | ||
| 1042 | } | ||
| 1043 | |||
| 1035 | static inline int tcp_fin_time(const struct sock *sk) | 1044 | static inline int tcp_fin_time(const struct sock *sk) |
| 1036 | { | 1045 | { |
| 1037 | int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; | 1046 | int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; |
diff --git a/include/net/tipc/tipc.h b/include/net/tipc/tipc.h index 9566608c88cf..15af6dca0b49 100644 --- a/include/net/tipc/tipc.h +++ b/include/net/tipc/tipc.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * include/net/tipc/tipc.h: Main include file for TIPC users | 2 | * include/net/tipc/tipc.h: Main include file for TIPC users |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2003-2006, Ericsson AB | 4 | * Copyright (c) 2003-2006, Ericsson AB |
| 5 | * Copyright (c) 2005, Wind River Systems | 5 | * Copyright (c) 2005,2010 Wind River Systems |
| 6 | * All rights reserved. | 6 | * All rights reserved. |
| 7 | * | 7 | * |
| 8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
| @@ -126,7 +126,7 @@ int tipc_createport(unsigned int tipc_user, | |||
| 126 | tipc_msg_event message_cb, | 126 | tipc_msg_event message_cb, |
| 127 | tipc_named_msg_event named_message_cb, | 127 | tipc_named_msg_event named_message_cb, |
| 128 | tipc_conn_msg_event conn_message_cb, | 128 | tipc_conn_msg_event conn_message_cb, |
| 129 | tipc_continue_event continue_event_cb,/* May be zero */ | 129 | tipc_continue_event continue_event_cb, |
| 130 | u32 *portref); | 130 | u32 *portref); |
| 131 | 131 | ||
| 132 | int tipc_deleteport(u32 portref); | 132 | int tipc_deleteport(u32 portref); |
| @@ -145,13 +145,13 @@ int tipc_set_portunreturnable(u32 portref, unsigned int isunreturnable); | |||
| 145 | int tipc_publish(u32 portref, unsigned int scope, | 145 | int tipc_publish(u32 portref, unsigned int scope, |
| 146 | struct tipc_name_seq const *name_seq); | 146 | struct tipc_name_seq const *name_seq); |
| 147 | int tipc_withdraw(u32 portref, unsigned int scope, | 147 | int tipc_withdraw(u32 portref, unsigned int scope, |
| 148 | struct tipc_name_seq const *name_seq); /* 0: all */ | 148 | struct tipc_name_seq const *name_seq); |
| 149 | 149 | ||
| 150 | int tipc_connect2port(u32 portref, struct tipc_portid const *port); | 150 | int tipc_connect2port(u32 portref, struct tipc_portid const *port); |
| 151 | 151 | ||
| 152 | int tipc_disconnect(u32 portref); | 152 | int tipc_disconnect(u32 portref); |
| 153 | 153 | ||
| 154 | int tipc_shutdown(u32 ref); /* Sends SHUTDOWN msg */ | 154 | int tipc_shutdown(u32 ref); |
| 155 | 155 | ||
| 156 | int tipc_isconnected(u32 portref, int *isconnected); | 156 | int tipc_isconnected(u32 portref, int *isconnected); |
| 157 | 157 | ||
| @@ -176,7 +176,7 @@ int tipc_send_buf(u32 portref, | |||
| 176 | 176 | ||
| 177 | int tipc_send2name(u32 portref, | 177 | int tipc_send2name(u32 portref, |
| 178 | struct tipc_name const *name, | 178 | struct tipc_name const *name, |
| 179 | u32 domain, /* 0:own zone */ | 179 | u32 domain, |
| 180 | unsigned int num_sect, | 180 | unsigned int num_sect, |
| 181 | struct iovec const *msg_sect); | 181 | struct iovec const *msg_sect); |
| 182 | 182 | ||
| @@ -188,7 +188,7 @@ int tipc_send_buf2name(u32 portref, | |||
| 188 | 188 | ||
| 189 | int tipc_forward2name(u32 portref, | 189 | int tipc_forward2name(u32 portref, |
| 190 | struct tipc_name const *name, | 190 | struct tipc_name const *name, |
| 191 | u32 domain, /*0: own zone */ | 191 | u32 domain, |
| 192 | unsigned int section_count, | 192 | unsigned int section_count, |
| 193 | struct iovec const *msg_sect, | 193 | struct iovec const *msg_sect, |
| 194 | struct tipc_portid const *origin, | 194 | struct tipc_portid const *origin, |
| @@ -228,14 +228,14 @@ int tipc_forward_buf2port(u32 portref, | |||
| 228 | 228 | ||
| 229 | int tipc_multicast(u32 portref, | 229 | int tipc_multicast(u32 portref, |
| 230 | struct tipc_name_seq const *seq, | 230 | struct tipc_name_seq const *seq, |
| 231 | u32 domain, /* 0:own zone */ | 231 | u32 domain, /* currently unused */ |
| 232 | unsigned int section_count, | 232 | unsigned int section_count, |
| 233 | struct iovec const *msg); | 233 | struct iovec const *msg); |
| 234 | 234 | ||
| 235 | #if 0 | 235 | #if 0 |
| 236 | int tipc_multicast_buf(u32 portref, | 236 | int tipc_multicast_buf(u32 portref, |
| 237 | struct tipc_name_seq const *seq, | 237 | struct tipc_name_seq const *seq, |
| 238 | u32 domain, /* 0:own zone */ | 238 | u32 domain, |
| 239 | void *buf, | 239 | void *buf, |
| 240 | unsigned int size); | 240 | unsigned int size); |
| 241 | #endif | 241 | #endif |
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index d65381cad0fc..42a0eb68b7b6 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h | |||
| @@ -44,7 +44,8 @@ extern int datagram_send_ctl(struct net *net, | |||
| 44 | struct msghdr *msg, | 44 | struct msghdr *msg, |
| 45 | struct flowi *fl, | 45 | struct flowi *fl, |
| 46 | struct ipv6_txoptions *opt, | 46 | struct ipv6_txoptions *opt, |
| 47 | int *hlimit, int *tclass); | 47 | int *hlimit, int *tclass, |
| 48 | int *dontfrag); | ||
| 48 | 49 | ||
| 49 | #define LOOPBACK4_IPV6 cpu_to_be32(0x7f000006) | 50 | #define LOOPBACK4_IPV6 cpu_to_be32(0x7f000006) |
| 50 | 51 | ||
diff --git a/include/net/x25.h b/include/net/x25.h index 468551ea4f1d..1479cb4a41fc 100644 --- a/include/net/x25.h +++ b/include/net/x25.h | |||
| @@ -80,8 +80,6 @@ enum { | |||
| 80 | #define X25_DEFAULT_PACKET_SIZE X25_PS128 /* Default Packet Size */ | 80 | #define X25_DEFAULT_PACKET_SIZE X25_PS128 /* Default Packet Size */ |
| 81 | #define X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */ | 81 | #define X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */ |
| 82 | #define X25_DEFAULT_REVERSE 0x00 /* Default Reverse Charging */ | 82 | #define X25_DEFAULT_REVERSE 0x00 /* Default Reverse Charging */ |
| 83 | #define X25_DENY_ACCPT_APPRV 0x01 /* Default value */ | ||
| 84 | #define X25_ALLOW_ACCPT_APPRV 0x00 /* Control enabled */ | ||
| 85 | 83 | ||
| 86 | #define X25_SMODULUS 8 | 84 | #define X25_SMODULUS 8 |
| 87 | #define X25_EMODULUS 128 | 85 | #define X25_EMODULUS 128 |
| @@ -113,6 +111,11 @@ enum { | |||
| 113 | #define X25_MAX_AE_LEN 40 /* Max num of semi-octets in AE - OSI Nw */ | 111 | #define X25_MAX_AE_LEN 40 /* Max num of semi-octets in AE - OSI Nw */ |
| 114 | #define X25_MAX_DTE_FACIL_LEN 21 /* Max length of DTE facility params */ | 112 | #define X25_MAX_DTE_FACIL_LEN 21 /* Max length of DTE facility params */ |
| 115 | 113 | ||
| 114 | /* Bitset in x25_sock->flags for misc flags */ | ||
| 115 | #define X25_Q_BIT_FLAG 0 | ||
| 116 | #define X25_INTERRUPT_FLAG 1 | ||
| 117 | #define X25_ACCPT_APPRV_FLAG 2 | ||
| 118 | |||
| 116 | /** | 119 | /** |
| 117 | * struct x25_route - x25 routing entry | 120 | * struct x25_route - x25 routing entry |
| 118 | * @node - entry in x25_list_lock | 121 | * @node - entry in x25_list_lock |
| @@ -146,10 +149,11 @@ struct x25_sock { | |||
| 146 | struct x25_address source_addr, dest_addr; | 149 | struct x25_address source_addr, dest_addr; |
| 147 | struct x25_neigh *neighbour; | 150 | struct x25_neigh *neighbour; |
| 148 | unsigned int lci, cudmatchlength; | 151 | unsigned int lci, cudmatchlength; |
| 149 | unsigned char state, condition, qbitincl, intflag, accptapprv; | 152 | unsigned char state, condition; |
| 150 | unsigned short vs, vr, va, vl; | 153 | unsigned short vs, vr, va, vl; |
| 151 | unsigned long t2, t21, t22, t23; | 154 | unsigned long t2, t21, t22, t23; |
| 152 | unsigned short fraglen; | 155 | unsigned short fraglen; |
| 156 | unsigned long flags; | ||
| 153 | struct sk_buff_head ack_queue; | 157 | struct sk_buff_head ack_queue; |
| 154 | struct sk_buff_head fragment_queue; | 158 | struct sk_buff_head fragment_queue; |
| 155 | struct sk_buff_head interrupt_in_queue; | 159 | struct sk_buff_head interrupt_in_queue; |
diff --git a/include/net/x25device.h b/include/net/x25device.h index 1415bcf93980..1fa08b49f1c2 100644 --- a/include/net/x25device.h +++ b/include/net/x25device.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/if_ether.h> | 4 | #include <linux/if_ether.h> |
| 5 | #include <linux/if_packet.h> | 5 | #include <linux/if_packet.h> |
| 6 | #include <linux/if_x25.h> | ||
| 6 | #include <linux/skbuff.h> | 7 | #include <linux/skbuff.h> |
| 7 | 8 | ||
| 8 | static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev) | 9 | static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev) |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index ac52f33f3e4a..1913af67c43d 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <net/route.h> | 20 | #include <net/route.h> |
| 21 | #include <net/ipv6.h> | 21 | #include <net/ipv6.h> |
| 22 | #include <net/ip6_fib.h> | 22 | #include <net/ip6_fib.h> |
| 23 | #include <net/flow.h> | ||
| 23 | 24 | ||
| 24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 25 | 26 | ||
| @@ -267,7 +268,6 @@ struct xfrm_policy_afinfo { | |||
| 267 | xfrm_address_t *saddr, | 268 | xfrm_address_t *saddr, |
| 268 | xfrm_address_t *daddr); | 269 | xfrm_address_t *daddr); |
| 269 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); | 270 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); |
| 270 | struct dst_entry *(*find_bundle)(struct flowi *fl, struct xfrm_policy *policy); | ||
| 271 | void (*decode_session)(struct sk_buff *skb, | 271 | void (*decode_session)(struct sk_buff *skb, |
| 272 | struct flowi *fl, | 272 | struct flowi *fl, |
| 273 | int reverse); | 273 | int reverse); |
| @@ -482,13 +482,14 @@ struct xfrm_policy { | |||
| 482 | atomic_t refcnt; | 482 | atomic_t refcnt; |
| 483 | struct timer_list timer; | 483 | struct timer_list timer; |
| 484 | 484 | ||
| 485 | struct flow_cache_object flo; | ||
| 486 | atomic_t genid; | ||
| 485 | u32 priority; | 487 | u32 priority; |
| 486 | u32 index; | 488 | u32 index; |
| 487 | struct xfrm_mark mark; | 489 | struct xfrm_mark mark; |
| 488 | struct xfrm_selector selector; | 490 | struct xfrm_selector selector; |
| 489 | struct xfrm_lifetime_cfg lft; | 491 | struct xfrm_lifetime_cfg lft; |
| 490 | struct xfrm_lifetime_cur curlft; | 492 | struct xfrm_lifetime_cur curlft; |
| 491 | struct dst_entry *bundles; | ||
| 492 | struct xfrm_policy_walk_entry walk; | 493 | struct xfrm_policy_walk_entry walk; |
| 493 | u8 type; | 494 | u8 type; |
| 494 | u8 action; | 495 | u8 action; |
| @@ -735,19 +736,12 @@ static inline void xfrm_pol_put(struct xfrm_policy *policy) | |||
| 735 | xfrm_policy_destroy(policy); | 736 | xfrm_policy_destroy(policy); |
| 736 | } | 737 | } |
| 737 | 738 | ||
| 738 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
| 739 | static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols) | 739 | static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols) |
| 740 | { | 740 | { |
| 741 | int i; | 741 | int i; |
| 742 | for (i = npols - 1; i >= 0; --i) | 742 | for (i = npols - 1; i >= 0; --i) |
| 743 | xfrm_pol_put(pols[i]); | 743 | xfrm_pol_put(pols[i]); |
| 744 | } | 744 | } |
| 745 | #else | ||
| 746 | static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols) | ||
| 747 | { | ||
| 748 | xfrm_pol_put(pols[0]); | ||
| 749 | } | ||
| 750 | #endif | ||
| 751 | 745 | ||
| 752 | extern void __xfrm_state_destroy(struct xfrm_state *); | 746 | extern void __xfrm_state_destroy(struct xfrm_state *); |
| 753 | 747 | ||
| @@ -878,11 +872,15 @@ struct xfrm_dst { | |||
| 878 | struct rt6_info rt6; | 872 | struct rt6_info rt6; |
| 879 | } u; | 873 | } u; |
| 880 | struct dst_entry *route; | 874 | struct dst_entry *route; |
| 875 | struct flow_cache_object flo; | ||
| 876 | struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; | ||
| 877 | int num_pols, num_xfrms; | ||
| 881 | #ifdef CONFIG_XFRM_SUB_POLICY | 878 | #ifdef CONFIG_XFRM_SUB_POLICY |
| 882 | struct flowi *origin; | 879 | struct flowi *origin; |
| 883 | struct xfrm_selector *partner; | 880 | struct xfrm_selector *partner; |
| 884 | #endif | 881 | #endif |
| 885 | u32 genid; | 882 | u32 xfrm_genid; |
| 883 | u32 policy_genid; | ||
| 886 | u32 route_mtu_cached; | 884 | u32 route_mtu_cached; |
| 887 | u32 child_mtu_cached; | 885 | u32 child_mtu_cached; |
| 888 | u32 route_cookie; | 886 | u32 route_cookie; |
| @@ -892,6 +890,7 @@ struct xfrm_dst { | |||
| 892 | #ifdef CONFIG_XFRM | 890 | #ifdef CONFIG_XFRM |
| 893 | static inline void xfrm_dst_destroy(struct xfrm_dst *xdst) | 891 | static inline void xfrm_dst_destroy(struct xfrm_dst *xdst) |
| 894 | { | 892 | { |
| 893 | xfrm_pols_put(xdst->pols, xdst->num_pols); | ||
| 895 | dst_release(xdst->route); | 894 | dst_release(xdst->route); |
| 896 | if (likely(xdst->u.dst.xfrm)) | 895 | if (likely(xdst->u.dst.xfrm)) |
| 897 | xfrm_state_put(xdst->u.dst.xfrm); | 896 | xfrm_state_put(xdst->u.dst.xfrm); |
