diff options
| -rw-r--r-- | drivers/net/cassini.c | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/ath5k/base.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath5k/hw.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/libertas/ethtool.c | 27 | ||||
| -rw-r--r-- | drivers/net/wireless/orinoco_cs.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl8187_dev.c | 14 | ||||
| -rw-r--r-- | include/linux/netfilter.h | 2 | ||||
| -rw-r--r-- | include/linux/netfilter_arp/arp_tables.h | 2 | ||||
| -rw-r--r-- | include/linux/netfilter_ipv4/ip_tables.h | 2 | ||||
| -rw-r--r-- | include/linux/netfilter_ipv6/ip6_tables.h | 2 | ||||
| -rw-r--r-- | include/linux/tcp.h | 2 | ||||
| -rw-r--r-- | net/ipv4/arp.c | 5 | ||||
| -rw-r--r-- | net/ipv4/ip_gre.c | 146 | ||||
| -rw-r--r-- | net/ipv4/ipip.c | 130 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 10 | ||||
| -rw-r--r-- | net/ipv6/sit.c | 89 | ||||
| -rw-r--r-- | net/key/af_key.c | 2 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 15 | ||||
| -rw-r--r-- | net/mac80211/wext.c | 1 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 11 |
21 files changed, 68 insertions, 413 deletions
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 93e13636f8dd..83768df27806 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
| @@ -142,8 +142,8 @@ | |||
| 142 | 142 | ||
| 143 | #define DRV_MODULE_NAME "cassini" | 143 | #define DRV_MODULE_NAME "cassini" |
| 144 | #define PFX DRV_MODULE_NAME ": " | 144 | #define PFX DRV_MODULE_NAME ": " |
| 145 | #define DRV_MODULE_VERSION "1.5" | 145 | #define DRV_MODULE_VERSION "1.6" |
| 146 | #define DRV_MODULE_RELDATE "4 Jan 2008" | 146 | #define DRV_MODULE_RELDATE "21 May 2008" |
| 147 | 147 | ||
| 148 | #define CAS_DEF_MSG_ENABLE \ | 148 | #define CAS_DEF_MSG_ENABLE \ |
| 149 | (NETIF_MSG_DRV | \ | 149 | (NETIF_MSG_DRV | \ |
| @@ -2136,9 +2136,12 @@ end_copy_pkt: | |||
| 2136 | if (addr) | 2136 | if (addr) |
| 2137 | cas_page_unmap(addr); | 2137 | cas_page_unmap(addr); |
| 2138 | } | 2138 | } |
| 2139 | skb->csum = csum_unfold(~csum); | ||
| 2140 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 2141 | skb->protocol = eth_type_trans(skb, cp->dev); | 2139 | skb->protocol = eth_type_trans(skb, cp->dev); |
| 2140 | if (skb->protocol == htons(ETH_P_IP)) { | ||
| 2141 | skb->csum = csum_unfold(~csum); | ||
| 2142 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 2143 | } else | ||
| 2144 | skb->ip_summed = CHECKSUM_NONE; | ||
| 2142 | return len; | 2145 | return len; |
| 2143 | } | 2146 | } |
| 2144 | 2147 | ||
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 4e5c8fc35200..635b9ac9aaa1 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
| @@ -1787,6 +1787,8 @@ ath5k_tasklet_rx(unsigned long data) | |||
| 1787 | 1787 | ||
| 1788 | spin_lock(&sc->rxbuflock); | 1788 | spin_lock(&sc->rxbuflock); |
| 1789 | do { | 1789 | do { |
| 1790 | rxs.flag = 0; | ||
| 1791 | |||
| 1790 | if (unlikely(list_empty(&sc->rxbuf))) { | 1792 | if (unlikely(list_empty(&sc->rxbuf))) { |
| 1791 | ATH5K_WARN(sc, "empty rx buf pool\n"); | 1793 | ATH5K_WARN(sc, "empty rx buf pool\n"); |
| 1792 | break; | 1794 | break; |
diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c index 5fb1ae6ad3e2..77990b56860b 100644 --- a/drivers/net/wireless/ath5k/hw.c +++ b/drivers/net/wireless/ath5k/hw.c | |||
| @@ -4119,6 +4119,7 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah, | |||
| 4119 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, | 4119 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, |
| 4120 | AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); | 4120 | AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); |
| 4121 | rs->rs_status = 0; | 4121 | rs->rs_status = 0; |
| 4122 | rs->rs_phyerr = 0; | ||
| 4122 | 4123 | ||
| 4123 | /* | 4124 | /* |
| 4124 | * Key table status | 4125 | * Key table status |
| @@ -4145,7 +4146,7 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah, | |||
| 4145 | if (rx_status->rx_status_1 & | 4146 | if (rx_status->rx_status_1 & |
| 4146 | AR5K_5210_RX_DESC_STATUS1_PHY_ERROR) { | 4147 | AR5K_5210_RX_DESC_STATUS1_PHY_ERROR) { |
| 4147 | rs->rs_status |= AR5K_RXERR_PHY; | 4148 | rs->rs_status |= AR5K_RXERR_PHY; |
| 4148 | rs->rs_phyerr = AR5K_REG_MS(rx_status->rx_status_1, | 4149 | rs->rs_phyerr |= AR5K_REG_MS(rx_status->rx_status_1, |
| 4149 | AR5K_5210_RX_DESC_STATUS1_PHY_ERROR); | 4150 | AR5K_5210_RX_DESC_STATUS1_PHY_ERROR); |
| 4150 | } | 4151 | } |
| 4151 | 4152 | ||
| @@ -4193,6 +4194,7 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah, | |||
| 4193 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, | 4194 | rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, |
| 4194 | AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); | 4195 | AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); |
| 4195 | rs->rs_status = 0; | 4196 | rs->rs_status = 0; |
| 4197 | rs->rs_phyerr = 0; | ||
| 4196 | 4198 | ||
| 4197 | /* | 4199 | /* |
| 4198 | * Key table status | 4200 | * Key table status |
| @@ -4215,7 +4217,7 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah, | |||
| 4215 | if (rx_status->rx_status_1 & | 4217 | if (rx_status->rx_status_1 & |
| 4216 | AR5K_5212_RX_DESC_STATUS1_PHY_ERROR) { | 4218 | AR5K_5212_RX_DESC_STATUS1_PHY_ERROR) { |
| 4217 | rs->rs_status |= AR5K_RXERR_PHY; | 4219 | rs->rs_status |= AR5K_RXERR_PHY; |
| 4218 | rs->rs_phyerr = AR5K_REG_MS(rx_err->rx_error_1, | 4220 | rs->rs_phyerr |= AR5K_REG_MS(rx_err->rx_error_1, |
| 4219 | AR5K_RX_DESC_ERROR1_PHY_ERROR_CODE); | 4221 | AR5K_RX_DESC_ERROR1_PHY_ERROR_CODE); |
| 4220 | } | 4222 | } |
| 4221 | 4223 | ||
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 437a9bcc9bd3..ed4317a17cbb 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -833,6 +833,7 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
| 833 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), | 833 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), |
| 834 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), | 834 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), |
| 835 | /* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), conflict with pcnet_cs */ | 835 | /* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), conflict with pcnet_cs */ |
| 836 | PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), | ||
| 836 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), | 837 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), |
| 837 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), | 838 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), |
| 838 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), | 839 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), |
diff --git a/drivers/net/wireless/libertas/ethtool.c b/drivers/net/wireless/libertas/ethtool.c index dcfdb404678b..688d60de55cb 100644 --- a/drivers/net/wireless/libertas/ethtool.c +++ b/drivers/net/wireless/libertas/ethtool.c | |||
| @@ -73,8 +73,8 @@ out: | |||
| 73 | return ret; | 73 | return ret; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | static void lbs_ethtool_get_stats(struct net_device * dev, | 76 | static void lbs_ethtool_get_stats(struct net_device *dev, |
| 77 | struct ethtool_stats * stats, u64 * data) | 77 | struct ethtool_stats *stats, uint64_t *data) |
| 78 | { | 78 | { |
| 79 | struct lbs_private *priv = dev->priv; | 79 | struct lbs_private *priv = dev->priv; |
| 80 | struct cmd_ds_mesh_access mesh_access; | 80 | struct cmd_ds_mesh_access mesh_access; |
| @@ -83,12 +83,12 @@ static void lbs_ethtool_get_stats(struct net_device * dev, | |||
| 83 | lbs_deb_enter(LBS_DEB_ETHTOOL); | 83 | lbs_deb_enter(LBS_DEB_ETHTOOL); |
| 84 | 84 | ||
| 85 | /* Get Mesh Statistics */ | 85 | /* Get Mesh Statistics */ |
| 86 | ret = lbs_prepare_and_send_command(priv, | 86 | ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_STATS, &mesh_access); |
| 87 | CMD_MESH_ACCESS, CMD_ACT_MESH_GET_STATS, | ||
| 88 | CMD_OPTION_WAITFORRSP, 0, &mesh_access); | ||
| 89 | 87 | ||
| 90 | if (ret) | 88 | if (ret) { |
| 89 | memset(data, 0, MESH_STATS_NUM*(sizeof(uint64_t))); | ||
| 91 | return; | 90 | return; |
| 91 | } | ||
| 92 | 92 | ||
| 93 | priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]); | 93 | priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]); |
| 94 | priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]); | 94 | priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]); |
| @@ -111,19 +111,18 @@ static void lbs_ethtool_get_stats(struct net_device * dev, | |||
| 111 | lbs_deb_enter(LBS_DEB_ETHTOOL); | 111 | lbs_deb_enter(LBS_DEB_ETHTOOL); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static int lbs_ethtool_get_sset_count(struct net_device * dev, int sset) | 114 | static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset) |
| 115 | { | 115 | { |
| 116 | switch (sset) { | 116 | struct lbs_private *priv = dev->priv; |
| 117 | case ETH_SS_STATS: | 117 | |
| 118 | if (sset == ETH_SS_STATS && dev == priv->mesh_dev) | ||
| 118 | return MESH_STATS_NUM; | 119 | return MESH_STATS_NUM; |
| 119 | default: | 120 | |
| 120 | return -EOPNOTSUPP; | 121 | return -EOPNOTSUPP; |
| 121 | } | ||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void lbs_ethtool_get_strings(struct net_device *dev, | 124 | static void lbs_ethtool_get_strings(struct net_device *dev, |
| 125 | u32 stringset, | 125 | uint32_t stringset, uint8_t *s) |
| 126 | u8 * s) | ||
| 127 | { | 126 | { |
| 128 | int i; | 127 | int i; |
| 129 | 128 | ||
diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c index 8b7f5768a103..1c216e015f64 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c | |||
| @@ -461,6 +461,7 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
| 461 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), /* Linksys WCF12 Wireless CompactFlash Card */ | 461 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), /* Linksys WCF12 Wireless CompactFlash Card */ |
| 462 | PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), /* ASUS SpaceLink WL-100 */ | 462 | PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), /* ASUS SpaceLink WL-100 */ |
| 463 | PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), /* SpeedStream SS1021 Wireless Adapter */ | 463 | PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), /* SpeedStream SS1021 Wireless Adapter */ |
| 464 | PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x3021), /* SpeedStream Wireless Adapter */ | ||
| 464 | PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), /* PLANEX RoadLannerWave GW-NS11H */ | 465 | PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), /* PLANEX RoadLannerWave GW-NS11H */ |
| 465 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), /* Airvast WN-100 */ | 466 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), /* Airvast WN-100 */ |
| 466 | PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), /* Adaptec Ultra Wireless ANW-8030 */ | 467 | PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), /* Adaptec Ultra Wireless ANW-8030 */ |
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index d5787b37e1fb..9223ada5f00e 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
| @@ -92,6 +92,7 @@ static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr, | |||
| 92 | u8 data[4]; | 92 | u8 data[4]; |
| 93 | struct usb_ctrlrequest dr; | 93 | struct usb_ctrlrequest dr; |
| 94 | } *buf; | 94 | } *buf; |
| 95 | int rc; | ||
| 95 | 96 | ||
| 96 | buf = kmalloc(sizeof(*buf), GFP_ATOMIC); | 97 | buf = kmalloc(sizeof(*buf), GFP_ATOMIC); |
| 97 | if (!buf) | 98 | if (!buf) |
| @@ -116,7 +117,11 @@ static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr, | |||
| 116 | usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0), | 117 | usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0), |
| 117 | (unsigned char *)dr, buf, len, | 118 | (unsigned char *)dr, buf, len, |
| 118 | rtl8187_iowrite_async_cb, buf); | 119 | rtl8187_iowrite_async_cb, buf); |
| 119 | usb_submit_urb(urb, GFP_ATOMIC); | 120 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
| 121 | if (rc < 0) { | ||
| 122 | kfree(buf); | ||
| 123 | usb_free_urb(urb); | ||
| 124 | } | ||
| 120 | } | 125 | } |
| 121 | 126 | ||
| 122 | static inline void rtl818x_iowrite32_async(struct rtl8187_priv *priv, | 127 | static inline void rtl818x_iowrite32_async(struct rtl8187_priv *priv, |
| @@ -169,6 +174,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
| 169 | struct urb *urb; | 174 | struct urb *urb; |
| 170 | __le16 rts_dur = 0; | 175 | __le16 rts_dur = 0; |
| 171 | u32 flags; | 176 | u32 flags; |
| 177 | int rc; | ||
| 172 | 178 | ||
| 173 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 179 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
| 174 | if (!urb) { | 180 | if (!urb) { |
| @@ -208,7 +214,11 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
| 208 | info->dev = dev; | 214 | info->dev = dev; |
| 209 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, 2), | 215 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, 2), |
| 210 | hdr, skb->len, rtl8187_tx_cb, skb); | 216 | hdr, skb->len, rtl8187_tx_cb, skb); |
| 211 | usb_submit_urb(urb, GFP_ATOMIC); | 217 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
| 218 | if (rc < 0) { | ||
| 219 | usb_free_urb(urb); | ||
| 220 | kfree_skb(skb); | ||
| 221 | } | ||
| 212 | 222 | ||
| 213 | return 0; | 223 | return 0; |
| 214 | } | 224 | } |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index e4c66593b5c6..0c5eb7ed8b3f 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 5 | #include <linux/init.h> | 5 | #include <linux/init.h> |
| 6 | #include <linux/types.h> | ||
| 7 | #include <linux/skbuff.h> | 6 | #include <linux/skbuff.h> |
| 8 | #include <linux/net.h> | 7 | #include <linux/net.h> |
| 9 | #include <linux/netdevice.h> | 8 | #include <linux/netdevice.h> |
| @@ -14,6 +13,7 @@ | |||
| 14 | #include <linux/list.h> | 13 | #include <linux/list.h> |
| 15 | #include <net/net_namespace.h> | 14 | #include <net/net_namespace.h> |
| 16 | #endif | 15 | #endif |
| 16 | #include <linux/types.h> | ||
| 17 | #include <linux/compiler.h> | 17 | #include <linux/compiler.h> |
| 18 | 18 | ||
| 19 | /* Responses from hook functions. */ | 19 | /* Responses from hook functions. */ |
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index dd9c97f2d436..590ac3d6d5d6 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
| @@ -11,11 +11,11 @@ | |||
| 11 | 11 | ||
| 12 | #ifdef __KERNEL__ | 12 | #ifdef __KERNEL__ |
| 13 | #include <linux/if.h> | 13 | #include <linux/if.h> |
| 14 | #include <linux/types.h> | ||
| 15 | #include <linux/in.h> | 14 | #include <linux/in.h> |
| 16 | #include <linux/if_arp.h> | 15 | #include <linux/if_arp.h> |
| 17 | #include <linux/skbuff.h> | 16 | #include <linux/skbuff.h> |
| 18 | #endif | 17 | #endif |
| 18 | #include <linux/types.h> | ||
| 19 | #include <linux/compiler.h> | 19 | #include <linux/compiler.h> |
| 20 | #include <linux/netfilter_arp.h> | 20 | #include <linux/netfilter_arp.h> |
| 21 | 21 | ||
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index bfc889f90276..092bd50581a9 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
| @@ -17,11 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | #ifdef __KERNEL__ | 18 | #ifdef __KERNEL__ |
| 19 | #include <linux/if.h> | 19 | #include <linux/if.h> |
| 20 | #include <linux/types.h> | ||
| 21 | #include <linux/in.h> | 20 | #include <linux/in.h> |
| 22 | #include <linux/ip.h> | 21 | #include <linux/ip.h> |
| 23 | #include <linux/skbuff.h> | 22 | #include <linux/skbuff.h> |
| 24 | #endif | 23 | #endif |
| 24 | #include <linux/types.h> | ||
| 25 | #include <linux/compiler.h> | 25 | #include <linux/compiler.h> |
| 26 | #include <linux/netfilter_ipv4.h> | 26 | #include <linux/netfilter_ipv4.h> |
| 27 | 27 | ||
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index f2507dcc5750..1089e33cf633 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
| @@ -17,11 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | #ifdef __KERNEL__ | 18 | #ifdef __KERNEL__ |
| 19 | #include <linux/if.h> | 19 | #include <linux/if.h> |
| 20 | #include <linux/types.h> | ||
| 21 | #include <linux/in6.h> | 20 | #include <linux/in6.h> |
| 22 | #include <linux/ipv6.h> | 21 | #include <linux/ipv6.h> |
| 23 | #include <linux/skbuff.h> | 22 | #include <linux/skbuff.h> |
| 24 | #endif | 23 | #endif |
| 24 | #include <linux/types.h> | ||
| 25 | #include <linux/compiler.h> | 25 | #include <linux/compiler.h> |
| 26 | #include <linux/netfilter_ipv6.h> | 26 | #include <linux/netfilter_ipv6.h> |
| 27 | 27 | ||
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index d96d9b122304..18e62e3d406f 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -355,7 +355,7 @@ struct tcp_sock { | |||
| 355 | u32 lost_retrans_low; /* Sent seq after any rxmit (lowest) */ | 355 | u32 lost_retrans_low; /* Sent seq after any rxmit (lowest) */ |
| 356 | 356 | ||
| 357 | u16 advmss; /* Advertised MSS */ | 357 | u16 advmss; /* Advertised MSS */ |
| 358 | u16 prior_ssthresh; /* ssthresh saved at recovery start */ | 358 | u32 prior_ssthresh; /* ssthresh saved at recovery start */ |
| 359 | u32 lost_out; /* Lost packets */ | 359 | u32 lost_out; /* Lost packets */ |
| 360 | u32 sacked_out; /* SACK'd packets */ | 360 | u32 sacked_out; /* SACK'd packets */ |
| 361 | u32 fackets_out; /* FACK'd packets */ | 361 | u32 fackets_out; /* FACK'd packets */ |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 418862f1bf22..9b539fa9fe18 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -1288,7 +1288,6 @@ static void arp_format_neigh_entry(struct seq_file *seq, | |||
| 1288 | struct neighbour *n) | 1288 | struct neighbour *n) |
| 1289 | { | 1289 | { |
| 1290 | char hbuffer[HBUFFERLEN]; | 1290 | char hbuffer[HBUFFERLEN]; |
| 1291 | const char hexbuf[] = "0123456789ABCDEF"; | ||
| 1292 | int k, j; | 1291 | int k, j; |
| 1293 | char tbuf[16]; | 1292 | char tbuf[16]; |
| 1294 | struct net_device *dev = n->dev; | 1293 | struct net_device *dev = n->dev; |
| @@ -1302,8 +1301,8 @@ static void arp_format_neigh_entry(struct seq_file *seq, | |||
| 1302 | else { | 1301 | else { |
| 1303 | #endif | 1302 | #endif |
| 1304 | for (k = 0, j = 0; k < HBUFFERLEN - 3 && j < dev->addr_len; j++) { | 1303 | for (k = 0, j = 0; k < HBUFFERLEN - 3 && j < dev->addr_len; j++) { |
| 1305 | hbuffer[k++] = hexbuf[(n->ha[j] >> 4) & 15]; | 1304 | hbuffer[k++] = hex_asc_hi(n->ha[j]); |
| 1306 | hbuffer[k++] = hexbuf[n->ha[j] & 15]; | 1305 | hbuffer[k++] = hex_asc_lo(n->ha[j]); |
| 1307 | hbuffer[k++] = ':'; | 1306 | hbuffer[k++] = ':'; |
| 1308 | } | 1307 | } |
| 1309 | hbuffer[--k] = 0; | 1308 | hbuffer[--k] = 0; |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 2ada033406de..4342cba4ff82 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -313,9 +313,8 @@ static void ipgre_tunnel_uninit(struct net_device *dev) | |||
| 313 | 313 | ||
| 314 | static void ipgre_err(struct sk_buff *skb, u32 info) | 314 | static void ipgre_err(struct sk_buff *skb, u32 info) |
| 315 | { | 315 | { |
| 316 | #ifndef I_WISH_WORLD_WERE_PERFECT | ||
| 317 | 316 | ||
| 318 | /* It is not :-( All the routers (except for Linux) return only | 317 | /* All the routers (except for Linux) return only |
| 319 | 8 bytes of packet payload. It means, that precise relaying of | 318 | 8 bytes of packet payload. It means, that precise relaying of |
| 320 | ICMP in the real Internet is absolutely infeasible. | 319 | ICMP in the real Internet is absolutely infeasible. |
| 321 | 320 | ||
| @@ -398,149 +397,6 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
| 398 | out: | 397 | out: |
| 399 | read_unlock(&ipgre_lock); | 398 | read_unlock(&ipgre_lock); |
| 400 | return; | 399 | return; |
| 401 | #else | ||
| 402 | struct iphdr *iph = (struct iphdr*)dp; | ||
| 403 | struct iphdr *eiph; | ||
| 404 | __be16 *p = (__be16*)(dp+(iph->ihl<<2)); | ||
| 405 | const int type = icmp_hdr(skb)->type; | ||
| 406 | const int code = icmp_hdr(skb)->code; | ||
| 407 | int rel_type = 0; | ||
| 408 | int rel_code = 0; | ||
| 409 | __be32 rel_info = 0; | ||
| 410 | __u32 n = 0; | ||
| 411 | __be16 flags; | ||
| 412 | int grehlen = (iph->ihl<<2) + 4; | ||
| 413 | struct sk_buff *skb2; | ||
| 414 | struct flowi fl; | ||
| 415 | struct rtable *rt; | ||
| 416 | |||
| 417 | if (p[1] != htons(ETH_P_IP)) | ||
| 418 | return; | ||
| 419 | |||
| 420 | flags = p[0]; | ||
| 421 | if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) { | ||
| 422 | if (flags&(GRE_VERSION|GRE_ROUTING)) | ||
| 423 | return; | ||
| 424 | if (flags&GRE_CSUM) | ||
| 425 | grehlen += 4; | ||
| 426 | if (flags&GRE_KEY) | ||
| 427 | grehlen += 4; | ||
| 428 | if (flags&GRE_SEQ) | ||
| 429 | grehlen += 4; | ||
| 430 | } | ||
| 431 | if (len < grehlen + sizeof(struct iphdr)) | ||
| 432 | return; | ||
| 433 | eiph = (struct iphdr*)(dp + grehlen); | ||
| 434 | |||
| 435 | switch (type) { | ||
| 436 | default: | ||
| 437 | return; | ||
| 438 | case ICMP_PARAMETERPROB: | ||
| 439 | n = ntohl(icmp_hdr(skb)->un.gateway) >> 24; | ||
| 440 | if (n < (iph->ihl<<2)) | ||
| 441 | return; | ||
| 442 | |||
| 443 | /* So... This guy found something strange INSIDE encapsulated | ||
| 444 | packet. Well, he is fool, but what can we do ? | ||
| 445 | */ | ||
| 446 | rel_type = ICMP_PARAMETERPROB; | ||
| 447 | n -= grehlen; | ||
| 448 | rel_info = htonl(n << 24); | ||
| 449 | break; | ||
| 450 | |||
| 451 | case ICMP_DEST_UNREACH: | ||
| 452 | switch (code) { | ||
| 453 | case ICMP_SR_FAILED: | ||
| 454 | case ICMP_PORT_UNREACH: | ||
| 455 | /* Impossible event. */ | ||
| 456 | return; | ||
| 457 | case ICMP_FRAG_NEEDED: | ||
| 458 | /* And it is the only really necessary thing :-) */ | ||
| 459 | n = ntohs(icmp_hdr(skb)->un.frag.mtu); | ||
| 460 | if (n < grehlen+68) | ||
| 461 | return; | ||
| 462 | n -= grehlen; | ||
| 463 | /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */ | ||
| 464 | if (n > ntohs(eiph->tot_len)) | ||
| 465 | return; | ||
| 466 | rel_info = htonl(n); | ||
| 467 | break; | ||
| 468 | default: | ||
| 469 | /* All others are translated to HOST_UNREACH. | ||
| 470 | rfc2003 contains "deep thoughts" about NET_UNREACH, | ||
| 471 | I believe, it is just ether pollution. --ANK | ||
| 472 | */ | ||
| 473 | rel_type = ICMP_DEST_UNREACH; | ||
| 474 | rel_code = ICMP_HOST_UNREACH; | ||
| 475 | break; | ||
| 476 | } | ||
| 477 | break; | ||
| 478 | case ICMP_TIME_EXCEEDED: | ||
| 479 | if (code != ICMP_EXC_TTL) | ||
| 480 | return; | ||
| 481 | break; | ||
| 482 | } | ||
| 483 | |||
| 484 | /* Prepare fake skb to feed it to icmp_send */ | ||
| 485 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
| 486 | if (skb2 == NULL) | ||
| 487 | return; | ||
| 488 | dst_release(skb2->dst); | ||
| 489 | skb2->dst = NULL; | ||
| 490 | skb_pull(skb2, skb->data - (u8*)eiph); | ||
| 491 | skb_reset_network_header(skb2); | ||
| 492 | |||
| 493 | /* Try to guess incoming interface */ | ||
| 494 | memset(&fl, 0, sizeof(fl)); | ||
| 495 | fl.fl4_dst = eiph->saddr; | ||
| 496 | fl.fl4_tos = RT_TOS(eiph->tos); | ||
| 497 | fl.proto = IPPROTO_GRE; | ||
| 498 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl)) { | ||
| 499 | kfree_skb(skb2); | ||
| 500 | return; | ||
| 501 | } | ||
| 502 | skb2->dev = rt->u.dst.dev; | ||
| 503 | |||
| 504 | /* route "incoming" packet */ | ||
| 505 | if (rt->rt_flags&RTCF_LOCAL) { | ||
| 506 | ip_rt_put(rt); | ||
| 507 | rt = NULL; | ||
| 508 | fl.fl4_dst = eiph->daddr; | ||
| 509 | fl.fl4_src = eiph->saddr; | ||
| 510 | fl.fl4_tos = eiph->tos; | ||
| 511 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || | ||
| 512 | rt->u.dst.dev->type != ARPHRD_IPGRE) { | ||
| 513 | ip_rt_put(rt); | ||
| 514 | kfree_skb(skb2); | ||
| 515 | return; | ||
| 516 | } | ||
| 517 | } else { | ||
| 518 | ip_rt_put(rt); | ||
| 519 | if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) || | ||
| 520 | skb2->dst->dev->type != ARPHRD_IPGRE) { | ||
| 521 | kfree_skb(skb2); | ||
| 522 | return; | ||
| 523 | } | ||
| 524 | } | ||
| 525 | |||
| 526 | /* change mtu on this route */ | ||
| 527 | if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { | ||
| 528 | if (n > dst_mtu(skb2->dst)) { | ||
| 529 | kfree_skb(skb2); | ||
| 530 | return; | ||
| 531 | } | ||
| 532 | skb2->dst->ops->update_pmtu(skb2->dst, n); | ||
| 533 | } else if (type == ICMP_TIME_EXCEEDED) { | ||
| 534 | struct ip_tunnel *t = netdev_priv(skb2->dev); | ||
| 535 | if (t->parms.iph.ttl) { | ||
| 536 | rel_type = ICMP_DEST_UNREACH; | ||
| 537 | rel_code = ICMP_HOST_UNREACH; | ||
| 538 | } | ||
| 539 | } | ||
| 540 | |||
| 541 | icmp_send(skb2, rel_type, rel_code, rel_info); | ||
| 542 | kfree_skb(skb2); | ||
| 543 | #endif | ||
| 544 | } | 400 | } |
| 545 | 401 | ||
| 546 | static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) | 402 | static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 149111f08e8d..af5cb53da5cc 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
| @@ -278,9 +278,8 @@ static void ipip_tunnel_uninit(struct net_device *dev) | |||
| 278 | 278 | ||
| 279 | static int ipip_err(struct sk_buff *skb, u32 info) | 279 | static int ipip_err(struct sk_buff *skb, u32 info) |
| 280 | { | 280 | { |
| 281 | #ifndef I_WISH_WORLD_WERE_PERFECT | ||
| 282 | 281 | ||
| 283 | /* It is not :-( All the routers (except for Linux) return only | 282 | /* All the routers (except for Linux) return only |
| 284 | 8 bytes of packet payload. It means, that precise relaying of | 283 | 8 bytes of packet payload. It means, that precise relaying of |
| 285 | ICMP in the real Internet is absolutely infeasible. | 284 | ICMP in the real Internet is absolutely infeasible. |
| 286 | */ | 285 | */ |
| @@ -337,133 +336,6 @@ static int ipip_err(struct sk_buff *skb, u32 info) | |||
| 337 | out: | 336 | out: |
| 338 | read_unlock(&ipip_lock); | 337 | read_unlock(&ipip_lock); |
| 339 | return err; | 338 | return err; |
| 340 | #else | ||
| 341 | struct iphdr *iph = (struct iphdr*)dp; | ||
| 342 | int hlen = iph->ihl<<2; | ||
| 343 | struct iphdr *eiph; | ||
| 344 | const int type = icmp_hdr(skb)->type; | ||
| 345 | const int code = icmp_hdr(skb)->code; | ||
| 346 | int rel_type = 0; | ||
| 347 | int rel_code = 0; | ||
| 348 | __be32 rel_info = 0; | ||
| 349 | __u32 n = 0; | ||
| 350 | struct sk_buff *skb2; | ||
| 351 | struct flowi fl; | ||
| 352 | struct rtable *rt; | ||
| 353 | |||
| 354 | if (len < hlen + sizeof(struct iphdr)) | ||
| 355 | return 0; | ||
| 356 | eiph = (struct iphdr*)(dp + hlen); | ||
| 357 | |||
| 358 | switch (type) { | ||
| 359 | default: | ||
| 360 | return 0; | ||
| 361 | case ICMP_PARAMETERPROB: | ||
| 362 | n = ntohl(icmp_hdr(skb)->un.gateway) >> 24; | ||
| 363 | if (n < hlen) | ||
| 364 | return 0; | ||
| 365 | |||
| 366 | /* So... This guy found something strange INSIDE encapsulated | ||
| 367 | packet. Well, he is fool, but what can we do ? | ||
| 368 | */ | ||
| 369 | rel_type = ICMP_PARAMETERPROB; | ||
| 370 | rel_info = htonl((n - hlen) << 24); | ||
| 371 | break; | ||
| 372 | |||
| 373 | case ICMP_DEST_UNREACH: | ||
| 374 | switch (code) { | ||
| 375 | case ICMP_SR_FAILED: | ||
| 376 | case ICMP_PORT_UNREACH: | ||
| 377 | /* Impossible event. */ | ||
| 378 | return 0; | ||
| 379 | case ICMP_FRAG_NEEDED: | ||
| 380 | /* And it is the only really necessary thing :-) */ | ||
| 381 | n = ntohs(icmp_hdr(skb)->un.frag.mtu); | ||
| 382 | if (n < hlen+68) | ||
| 383 | return 0; | ||
| 384 | n -= hlen; | ||
| 385 | /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */ | ||
| 386 | if (n > ntohs(eiph->tot_len)) | ||
| 387 | return 0; | ||
| 388 | rel_info = htonl(n); | ||
| 389 | break; | ||
| 390 | default: | ||
| 391 | /* All others are translated to HOST_UNREACH. | ||
| 392 | rfc2003 contains "deep thoughts" about NET_UNREACH, | ||
| 393 | I believe, it is just ether pollution. --ANK | ||
| 394 | */ | ||
| 395 | rel_type = ICMP_DEST_UNREACH; | ||
| 396 | rel_code = ICMP_HOST_UNREACH; | ||
| 397 | break; | ||
| 398 | } | ||
| 399 | break; | ||
| 400 | case ICMP_TIME_EXCEEDED: | ||
| 401 | if (code != ICMP_EXC_TTL) | ||
| 402 | return 0; | ||
| 403 | break; | ||
| 404 | } | ||
| 405 | |||
| 406 | /* Prepare fake skb to feed it to icmp_send */ | ||
| 407 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
| 408 | if (skb2 == NULL) | ||
| 409 | return 0; | ||
| 410 | dst_release(skb2->dst); | ||
| 411 | skb2->dst = NULL; | ||
| 412 | skb_pull(skb2, skb->data - (u8*)eiph); | ||
| 413 | skb_reset_network_header(skb2); | ||
| 414 | |||
| 415 | /* Try to guess incoming interface */ | ||
| 416 | memset(&fl, 0, sizeof(fl)); | ||
| 417 | fl.fl4_daddr = eiph->saddr; | ||
| 418 | fl.fl4_tos = RT_TOS(eiph->tos); | ||
| 419 | fl.proto = IPPROTO_IPIP; | ||
| 420 | if (ip_route_output_key(dev_net(skb->dev), &rt, &key)) { | ||
| 421 | kfree_skb(skb2); | ||
| 422 | return 0; | ||
| 423 | } | ||
| 424 | skb2->dev = rt->u.dst.dev; | ||
| 425 | |||
| 426 | /* route "incoming" packet */ | ||
| 427 | if (rt->rt_flags&RTCF_LOCAL) { | ||
| 428 | ip_rt_put(rt); | ||
| 429 | rt = NULL; | ||
| 430 | fl.fl4_daddr = eiph->daddr; | ||
| 431 | fl.fl4_src = eiph->saddr; | ||
| 432 | fl.fl4_tos = eiph->tos; | ||
| 433 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || | ||
| 434 | rt->u.dst.dev->type != ARPHRD_TUNNEL) { | ||
| 435 | ip_rt_put(rt); | ||
| 436 | kfree_skb(skb2); | ||
| 437 | return 0; | ||
| 438 | } | ||
| 439 | } else { | ||
| 440 | ip_rt_put(rt); | ||
| 441 | if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) || | ||
| 442 | skb2->dst->dev->type != ARPHRD_TUNNEL) { | ||
| 443 | kfree_skb(skb2); | ||
| 444 | return 0; | ||
| 445 | } | ||
| 446 | } | ||
| 447 | |||
| 448 | /* change mtu on this route */ | ||
| 449 | if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { | ||
| 450 | if (n > dst_mtu(skb2->dst)) { | ||
| 451 | kfree_skb(skb2); | ||
| 452 | return 0; | ||
| 453 | } | ||
| 454 | skb2->dst->ops->update_pmtu(skb2->dst, n); | ||
| 455 | } else if (type == ICMP_TIME_EXCEEDED) { | ||
| 456 | struct ip_tunnel *t = netdev_priv(skb2->dev); | ||
| 457 | if (t->parms.iph.ttl) { | ||
| 458 | rel_type = ICMP_DEST_UNREACH; | ||
| 459 | rel_code = ICMP_HOST_UNREACH; | ||
| 460 | } | ||
| 461 | } | ||
| 462 | |||
| 463 | icmp_send(skb2, rel_type, rel_code, rel_info); | ||
| 464 | kfree_skb(skb2); | ||
| 465 | return 0; | ||
| 466 | #endif | ||
| 467 | } | 339 | } |
| 468 | 340 | ||
| 469 | static inline void ipip_ecn_decapsulate(const struct iphdr *outer_iph, | 341 | static inline void ipip_ecn_decapsulate(const struct iphdr *outer_iph, |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index debf23581606..e399bde7813a 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -1836,7 +1836,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 1836 | { | 1836 | { |
| 1837 | struct tcp_sock *tp = tcp_sk(sk); | 1837 | struct tcp_sock *tp = tcp_sk(sk); |
| 1838 | struct inet_connection_sock *icsk = inet_csk(sk); | 1838 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 1839 | unsigned int cur_mss = tcp_current_mss(sk, 0); | 1839 | unsigned int cur_mss; |
| 1840 | int err; | 1840 | int err; |
| 1841 | 1841 | ||
| 1842 | /* Inconslusive MTU probe */ | 1842 | /* Inconslusive MTU probe */ |
| @@ -1858,6 +1858,11 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 1858 | return -ENOMEM; | 1858 | return -ENOMEM; |
| 1859 | } | 1859 | } |
| 1860 | 1860 | ||
| 1861 | if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) | ||
| 1862 | return -EHOSTUNREACH; /* Routing failure or similar. */ | ||
| 1863 | |||
| 1864 | cur_mss = tcp_current_mss(sk, 0); | ||
| 1865 | |||
| 1861 | /* If receiver has shrunk his window, and skb is out of | 1866 | /* If receiver has shrunk his window, and skb is out of |
| 1862 | * new window, do not retransmit it. The exception is the | 1867 | * new window, do not retransmit it. The exception is the |
| 1863 | * case, when window is shrunk to zero. In this case | 1868 | * case, when window is shrunk to zero. In this case |
| @@ -1884,9 +1889,6 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 1884 | (sysctl_tcp_retrans_collapse != 0)) | 1889 | (sysctl_tcp_retrans_collapse != 0)) |
| 1885 | tcp_retrans_try_collapse(sk, skb, cur_mss); | 1890 | tcp_retrans_try_collapse(sk, skb, cur_mss); |
| 1886 | 1891 | ||
| 1887 | if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) | ||
| 1888 | return -EHOSTUNREACH; /* Routing failure or similar. */ | ||
| 1889 | |||
| 1890 | /* Some Solaris stacks overoptimize and ignore the FIN on a | 1892 | /* Some Solaris stacks overoptimize and ignore the FIN on a |
| 1891 | * retransmit when old data is attached. So strip it off | 1893 | * retransmit when old data is attached. So strip it off |
| 1892 | * since it is cheap to do so and saves bytes on the network. | 1894 | * since it is cheap to do so and saves bytes on the network. |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 5a6fab95569f..3de6ffdaedf2 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -403,9 +403,8 @@ static void ipip6_tunnel_uninit(struct net_device *dev) | |||
| 403 | 403 | ||
| 404 | static int ipip6_err(struct sk_buff *skb, u32 info) | 404 | static int ipip6_err(struct sk_buff *skb, u32 info) |
| 405 | { | 405 | { |
| 406 | #ifndef I_WISH_WORLD_WERE_PERFECT | ||
| 407 | 406 | ||
| 408 | /* It is not :-( All the routers (except for Linux) return only | 407 | /* All the routers (except for Linux) return only |
| 409 | 8 bytes of packet payload. It means, that precise relaying of | 408 | 8 bytes of packet payload. It means, that precise relaying of |
| 410 | ICMP in the real Internet is absolutely infeasible. | 409 | ICMP in the real Internet is absolutely infeasible. |
| 411 | */ | 410 | */ |
| @@ -462,92 +461,6 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
| 462 | out: | 461 | out: |
| 463 | read_unlock(&ipip6_lock); | 462 | read_unlock(&ipip6_lock); |
| 464 | return err; | 463 | return err; |
| 465 | #else | ||
| 466 | struct iphdr *iph = (struct iphdr*)dp; | ||
| 467 | int hlen = iph->ihl<<2; | ||
| 468 | struct ipv6hdr *iph6; | ||
| 469 | const int type = icmp_hdr(skb)->type; | ||
| 470 | const int code = icmp_hdr(skb)->code; | ||
| 471 | int rel_type = 0; | ||
| 472 | int rel_code = 0; | ||
| 473 | int rel_info = 0; | ||
| 474 | struct sk_buff *skb2; | ||
| 475 | struct rt6_info *rt6i; | ||
| 476 | |||
| 477 | if (len < hlen + sizeof(struct ipv6hdr)) | ||
| 478 | return; | ||
| 479 | iph6 = (struct ipv6hdr*)(dp + hlen); | ||
| 480 | |||
| 481 | switch (type) { | ||
| 482 | default: | ||
| 483 | return; | ||
| 484 | case ICMP_PARAMETERPROB: | ||
| 485 | if (icmp_hdr(skb)->un.gateway < hlen) | ||
| 486 | return; | ||
| 487 | |||
| 488 | /* So... This guy found something strange INSIDE encapsulated | ||
| 489 | packet. Well, he is fool, but what can we do ? | ||
| 490 | */ | ||
| 491 | rel_type = ICMPV6_PARAMPROB; | ||
| 492 | rel_info = icmp_hdr(skb)->un.gateway - hlen; | ||
| 493 | break; | ||
| 494 | |||
| 495 | case ICMP_DEST_UNREACH: | ||
| 496 | switch (code) { | ||
| 497 | case ICMP_SR_FAILED: | ||
| 498 | case ICMP_PORT_UNREACH: | ||
| 499 | /* Impossible event. */ | ||
| 500 | return; | ||
| 501 | case ICMP_FRAG_NEEDED: | ||
| 502 | /* Too complicated case ... */ | ||
| 503 | return; | ||
| 504 | default: | ||
| 505 | /* All others are translated to HOST_UNREACH. | ||
| 506 | rfc2003 contains "deep thoughts" about NET_UNREACH, | ||
| 507 | I believe, it is just ether pollution. --ANK | ||
| 508 | */ | ||
| 509 | rel_type = ICMPV6_DEST_UNREACH; | ||
| 510 | rel_code = ICMPV6_ADDR_UNREACH; | ||
| 511 | break; | ||
| 512 | } | ||
| 513 | break; | ||
| 514 | case ICMP_TIME_EXCEEDED: | ||
| 515 | if (code != ICMP_EXC_TTL) | ||
| 516 | return; | ||
| 517 | rel_type = ICMPV6_TIME_EXCEED; | ||
| 518 | rel_code = ICMPV6_EXC_HOPLIMIT; | ||
| 519 | break; | ||
| 520 | } | ||
| 521 | |||
| 522 | /* Prepare fake skb to feed it to icmpv6_send */ | ||
| 523 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
| 524 | if (skb2 == NULL) | ||
| 525 | return 0; | ||
| 526 | dst_release(skb2->dst); | ||
| 527 | skb2->dst = NULL; | ||
| 528 | skb_pull(skb2, skb->data - (u8*)iph6); | ||
| 529 | skb_reset_network_header(skb2); | ||
| 530 | |||
| 531 | /* Try to guess incoming interface */ | ||
| 532 | rt6i = rt6_lookup(dev_net(skb->dev), &iph6->saddr, NULL, NULL, 0); | ||
| 533 | if (rt6i && rt6i->rt6i_dev) { | ||
| 534 | skb2->dev = rt6i->rt6i_dev; | ||
| 535 | |||
| 536 | rt6i = rt6_lookup(dev_net(skb->dev), | ||
| 537 | &iph6->daddr, &iph6->saddr, NULL, 0); | ||
| 538 | |||
| 539 | if (rt6i && rt6i->rt6i_dev && rt6i->rt6i_dev->type == ARPHRD_SIT) { | ||
| 540 | struct ip_tunnel *t = netdev_priv(rt6i->rt6i_dev); | ||
| 541 | if (rel_type == ICMPV6_TIME_EXCEED && t->parms.iph.ttl) { | ||
| 542 | rel_type = ICMPV6_DEST_UNREACH; | ||
| 543 | rel_code = ICMPV6_ADDR_UNREACH; | ||
| 544 | } | ||
| 545 | icmpv6_send(skb2, rel_type, rel_code, rel_info, skb2->dev); | ||
| 546 | } | ||
| 547 | } | ||
| 548 | kfree_skb(skb2); | ||
| 549 | return 0; | ||
| 550 | #endif | ||
| 551 | } | 464 | } |
| 552 | 465 | ||
| 553 | static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) | 466 | static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 9e7236ff6bcc..9bba7ac5fee0 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -1251,7 +1251,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr, | |||
| 1251 | x->sel.prefixlen_s = addr->sadb_address_prefixlen; | 1251 | x->sel.prefixlen_s = addr->sadb_address_prefixlen; |
| 1252 | } | 1252 | } |
| 1253 | 1253 | ||
| 1254 | if (x->props.mode == XFRM_MODE_TRANSPORT) | 1254 | if (!x->sel.family) |
| 1255 | x->sel.family = x->props.family; | 1255 | x->sel.family = x->props.family; |
| 1256 | 1256 | ||
| 1257 | if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) { | 1257 | if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) { |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index e470bf12b765..7cfd12e0d1e2 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -730,7 +730,17 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
| 730 | if (bss->wmm_ie) { | 730 | if (bss->wmm_ie) { |
| 731 | wmm = 1; | 731 | wmm = 1; |
| 732 | } | 732 | } |
| 733 | |||
| 734 | /* get all rates supported by the device and the AP as | ||
| 735 | * some APs don't like getting a superset of their rates | ||
| 736 | * in the association request (e.g. D-Link DAP 1353 in | ||
| 737 | * b-only mode) */ | ||
| 738 | rates_len = ieee80211_compatible_rates(bss, sband, &rates); | ||
| 739 | |||
| 733 | ieee80211_rx_bss_put(dev, bss); | 740 | ieee80211_rx_bss_put(dev, bss); |
| 741 | } else { | ||
| 742 | rates = ~0; | ||
| 743 | rates_len = sband->n_bitrates; | ||
| 734 | } | 744 | } |
| 735 | 745 | ||
| 736 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); | 746 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); |
| @@ -761,10 +771,7 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
| 761 | *pos++ = ifsta->ssid_len; | 771 | *pos++ = ifsta->ssid_len; |
| 762 | memcpy(pos, ifsta->ssid, ifsta->ssid_len); | 772 | memcpy(pos, ifsta->ssid, ifsta->ssid_len); |
| 763 | 773 | ||
| 764 | /* all supported rates should be added here but some APs | 774 | /* add all rates which were marked to be used above */ |
| 765 | * (e.g. D-Link DAP 1353 in b-only mode) don't like that | ||
| 766 | * Therefore only add rates the AP supports */ | ||
| 767 | rates_len = ieee80211_compatible_rates(bss, sband, &rates); | ||
| 768 | supp_rates_len = rates_len; | 775 | supp_rates_len = rates_len; |
| 769 | if (supp_rates_len > 8) | 776 | if (supp_rates_len > 8) |
| 770 | supp_rates_len = 8; | 777 | supp_rates_len = 8; |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 76e1de1dc735..457ebf9e85ae 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -209,7 +209,6 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev, | |||
| 209 | range->num_frequency = c; | 209 | range->num_frequency = c; |
| 210 | 210 | ||
| 211 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); | 211 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); |
| 212 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWTHRSPY); | ||
| 213 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); | 212 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); |
| 214 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); | 213 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); |
| 215 | 214 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index a1b0fbe3ea35..b976d9ed10e4 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -50,19 +50,8 @@ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | |||
| 50 | 50 | ||
| 51 | switch (type) { | 51 | switch (type) { |
| 52 | case XFRMA_ALG_AUTH: | 52 | case XFRMA_ALG_AUTH: |
| 53 | if (!algp->alg_key_len && | ||
| 54 | strcmp(algp->alg_name, "digest_null") != 0) | ||
| 55 | return -EINVAL; | ||
| 56 | break; | ||
| 57 | |||
| 58 | case XFRMA_ALG_CRYPT: | 53 | case XFRMA_ALG_CRYPT: |
| 59 | if (!algp->alg_key_len && | ||
| 60 | strcmp(algp->alg_name, "cipher_null") != 0) | ||
| 61 | return -EINVAL; | ||
| 62 | break; | ||
| 63 | |||
| 64 | case XFRMA_ALG_COMP: | 54 | case XFRMA_ALG_COMP: |
| 65 | /* Zero length keys are legal. */ | ||
| 66 | break; | 55 | break; |
| 67 | 56 | ||
| 68 | default: | 57 | default: |
