Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (24 commits) usbnet: Remove over-broad module alias from zaurus. MAINTAINERS: drop Michael from bfin_mac driver net/can: activate bit-timing calculation and netlink based drivers by default rionet: fix NULL pointer dereference in rionet_remove net+crypto: Use vmalloc for zlib inflate buffers. netfilter: Fix ip_route_me_harder triggering ip_rt_bug ipv4: Fix IPsec slowpath fragmentation problem ipv4: Fix packet size calculation in __ip_append_data cxgb3: skb_record_rx_queue now records the queue index relative to the net_device. bridge: Only flood unregistered groups to routers qlge: Add maintainer. MAINTAINERS: mark socketcan-core lists as subscribers-only MAINTAINERS: Remove Sven Eckelmann from BATMAN ADVANCED r8169: fix wrong register use. net/usb/kalmia: signedness bug in kalmia_bind() net/usb: kalmia: Various fixes for better support of non-x86 architectures. rtl8192cu: Fix missing firmware load udp/recvmsg: Clear MSG_TRUNC flag when starting over for a new packet ipv6/udp: Use the correct variable to determine non-blocking condition netconsole: fix build when CONFIG_NETCONSOLE_DYNAMIC is turned on ...
This commit is contained in:
commit
0e90ed0e8b
|
@ -1392,7 +1392,6 @@ F: include/linux/backlight.h
|
||||||
BATMAN ADVANCED
|
BATMAN ADVANCED
|
||||||
M: Marek Lindner <lindner_marek@yahoo.de>
|
M: Marek Lindner <lindner_marek@yahoo.de>
|
||||||
M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
|
M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
|
||||||
M: Sven Eckelmann <sven@narfation.org>
|
|
||||||
L: b.a.t.m.a.n@lists.open-mesh.org
|
L: b.a.t.m.a.n@lists.open-mesh.org
|
||||||
W: http://www.open-mesh.org/
|
W: http://www.open-mesh.org/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -1425,7 +1424,6 @@ S: Supported
|
||||||
F: arch/blackfin/
|
F: arch/blackfin/
|
||||||
|
|
||||||
BLACKFIN EMAC DRIVER
|
BLACKFIN EMAC DRIVER
|
||||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
|
||||||
L: uclinux-dist-devel@blackfin.uclinux.org
|
L: uclinux-dist-devel@blackfin.uclinux.org
|
||||||
W: http://blackfin.uclinux.org
|
W: http://blackfin.uclinux.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -1641,7 +1639,7 @@ CAN NETWORK LAYER
|
||||||
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||||
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
|
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
|
||||||
M: Urs Thuermann <urs.thuermann@volkswagen.de>
|
M: Urs Thuermann <urs.thuermann@volkswagen.de>
|
||||||
L: socketcan-core@lists.berlios.de
|
L: socketcan-core@lists.berlios.de (subscribers-only)
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://developer.berlios.de/projects/socketcan/
|
W: http://developer.berlios.de/projects/socketcan/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -1653,7 +1651,7 @@ F: include/linux/can/raw.h
|
||||||
|
|
||||||
CAN NETWORK DRIVERS
|
CAN NETWORK DRIVERS
|
||||||
M: Wolfgang Grandegger <wg@grandegger.com>
|
M: Wolfgang Grandegger <wg@grandegger.com>
|
||||||
L: socketcan-core@lists.berlios.de
|
L: socketcan-core@lists.berlios.de (subscribers-only)
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://developer.berlios.de/projects/socketcan/
|
W: http://developer.berlios.de/projects/socketcan/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -5183,6 +5181,7 @@ S: Supported
|
||||||
F: drivers/net/qlcnic/
|
F: drivers/net/qlcnic/
|
||||||
|
|
||||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||||
|
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
|
||||||
M: Ron Mercer <ron.mercer@qlogic.com>
|
M: Ron Mercer <ron.mercer@qlogic.com>
|
||||||
M: linux-driver@qlogic.com
|
M: linux-driver@qlogic.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/net.h>
|
#include <linux/net.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
|
|
||||||
#define DEFLATE_DEF_LEVEL Z_DEFAULT_COMPRESSION
|
#define DEFLATE_DEF_LEVEL Z_DEFAULT_COMPRESSION
|
||||||
#define DEFLATE_DEF_WINBITS 11
|
#define DEFLATE_DEF_WINBITS 11
|
||||||
|
@ -73,7 +72,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct z_stream_s *stream = &ctx->decomp_stream;
|
struct z_stream_s *stream = &ctx->decomp_stream;
|
||||||
|
|
||||||
stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
|
stream->workspace = vzalloc(zlib_inflate_workspacesize());
|
||||||
if (!stream->workspace) {
|
if (!stream->workspace) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -86,7 +85,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx)
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
out_free:
|
out_free:
|
||||||
kfree(stream->workspace);
|
vfree(stream->workspace);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +98,7 @@ static void deflate_comp_exit(struct deflate_ctx *ctx)
|
||||||
static void deflate_decomp_exit(struct deflate_ctx *ctx)
|
static void deflate_decomp_exit(struct deflate_ctx *ctx)
|
||||||
{
|
{
|
||||||
zlib_inflateEnd(&ctx->decomp_stream);
|
zlib_inflateEnd(&ctx->decomp_stream);
|
||||||
kfree(ctx->decomp_stream.workspace);
|
vfree(ctx->decomp_stream.workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int deflate_init(struct crypto_tfm *tfm)
|
static int deflate_init(struct crypto_tfm *tfm)
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/net.h>
|
#include <linux/net.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
|
|
||||||
#include <crypto/internal/compress.h>
|
#include <crypto/internal/compress.h>
|
||||||
|
|
||||||
|
@ -60,7 +59,7 @@ static void zlib_decomp_exit(struct zlib_ctx *ctx)
|
||||||
|
|
||||||
if (stream->workspace) {
|
if (stream->workspace) {
|
||||||
zlib_inflateEnd(stream);
|
zlib_inflateEnd(stream);
|
||||||
kfree(stream->workspace);
|
vfree(stream->workspace);
|
||||||
stream->workspace = NULL;
|
stream->workspace = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,13 +227,13 @@ static int zlib_decompress_setup(struct crypto_pcomp *tfm, void *params,
|
||||||
? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS])
|
? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS])
|
||||||
: DEF_WBITS;
|
: DEF_WBITS;
|
||||||
|
|
||||||
stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
|
stream->workspace = vzalloc(zlib_inflate_workspacesize());
|
||||||
if (!stream->workspace)
|
if (!stream->workspace)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = zlib_inflateInit2(stream, ctx->decomp_windowBits);
|
ret = zlib_inflateInit2(stream, ctx->decomp_windowBits);
|
||||||
if (ret != Z_OK) {
|
if (ret != Z_OK) {
|
||||||
kfree(stream->workspace);
|
vfree(stream->workspace);
|
||||||
stream->workspace = NULL;
|
stream->workspace = NULL;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3416,7 +3416,8 @@ config NETCONSOLE
|
||||||
|
|
||||||
config NETCONSOLE_DYNAMIC
|
config NETCONSOLE_DYNAMIC
|
||||||
bool "Dynamic reconfiguration of logging targets"
|
bool "Dynamic reconfiguration of logging targets"
|
||||||
depends on NETCONSOLE && SYSFS && CONFIGFS_FS
|
depends on NETCONSOLE && SYSFS && CONFIGFS_FS && \
|
||||||
|
!(NETCONSOLE=y && CONFIGFS_FS=m)
|
||||||
help
|
help
|
||||||
This option enables the ability to dynamically reconfigure target
|
This option enables the ability to dynamically reconfigure target
|
||||||
parameters (interface, IP addresses, port numbers, MAC addresses)
|
parameters (interface, IP addresses, port numbers, MAC addresses)
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#include <linux/zlib.h>
|
#include <linux/zlib.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#define BNX2X_MAIN
|
#define BNX2X_MAIN
|
||||||
#include "bnx2x.h"
|
#include "bnx2x.h"
|
||||||
|
@ -4537,8 +4538,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp)
|
||||||
if (bp->strm == NULL)
|
if (bp->strm == NULL)
|
||||||
goto gunzip_nomem2;
|
goto gunzip_nomem2;
|
||||||
|
|
||||||
bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(),
|
bp->strm->workspace = vmalloc(zlib_inflate_workspacesize());
|
||||||
GFP_KERNEL);
|
|
||||||
if (bp->strm->workspace == NULL)
|
if (bp->strm->workspace == NULL)
|
||||||
goto gunzip_nomem3;
|
goto gunzip_nomem3;
|
||||||
|
|
||||||
|
@ -4562,7 +4562,7 @@ gunzip_nomem1:
|
||||||
static void bnx2x_gunzip_end(struct bnx2x *bp)
|
static void bnx2x_gunzip_end(struct bnx2x *bp)
|
||||||
{
|
{
|
||||||
if (bp->strm) {
|
if (bp->strm) {
|
||||||
kfree(bp->strm->workspace);
|
vfree(bp->strm->workspace);
|
||||||
kfree(bp->strm);
|
kfree(bp->strm);
|
||||||
bp->strm = NULL;
|
bp->strm = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ config CAN_SLCAN
|
||||||
config CAN_DEV
|
config CAN_DEV
|
||||||
tristate "Platform CAN drivers with Netlink support"
|
tristate "Platform CAN drivers with Netlink support"
|
||||||
depends on CAN
|
depends on CAN
|
||||||
default Y
|
default y
|
||||||
---help---
|
---help---
|
||||||
Enables the common framework for platform CAN drivers with Netlink
|
Enables the common framework for platform CAN drivers with Netlink
|
||||||
support. This is the standard library for CAN drivers.
|
support. This is the standard library for CAN drivers.
|
||||||
|
@ -45,7 +45,7 @@ config CAN_DEV
|
||||||
config CAN_CALC_BITTIMING
|
config CAN_CALC_BITTIMING
|
||||||
bool "CAN bit-timing calculation"
|
bool "CAN bit-timing calculation"
|
||||||
depends on CAN_DEV
|
depends on CAN_DEV
|
||||||
default Y
|
default y
|
||||||
---help---
|
---help---
|
||||||
If enabled, CAN bit-timing parameters will be calculated for the
|
If enabled, CAN bit-timing parameters will be calculated for the
|
||||||
bit-rate specified via Netlink argument "bitrate" when the device
|
bit-rate specified via Netlink argument "bitrate" when the device
|
||||||
|
|
|
@ -2026,7 +2026,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
} else
|
} else
|
||||||
skb_checksum_none_assert(skb);
|
skb_checksum_none_assert(skb);
|
||||||
skb_record_rx_queue(skb, qs - &adap->sge.qs[0]);
|
skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
|
||||||
|
|
||||||
if (unlikely(p->vlan_valid)) {
|
if (unlikely(p->vlan_valid)) {
|
||||||
struct vlan_group *grp = pi->vlan_grp;
|
struct vlan_group *grp = pi->vlan_grp;
|
||||||
|
@ -2145,7 +2145,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
|
||||||
if (!complete)
|
if (!complete)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
skb_record_rx_queue(skb, qs - &adap->sge.qs[0]);
|
skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
|
||||||
|
|
||||||
if (unlikely(cpl->vlan_valid)) {
|
if (unlikely(cpl->vlan_valid)) {
|
||||||
struct vlan_group *grp = pi->vlan_grp;
|
struct vlan_group *grp = pi->vlan_grp;
|
||||||
|
|
|
@ -305,7 +305,7 @@ static void z_decomp_free(void *arg)
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
zlib_inflateEnd(&state->strm);
|
zlib_inflateEnd(&state->strm);
|
||||||
kfree(state->strm.workspace);
|
vfree(state->strm.workspace);
|
||||||
kfree(state);
|
kfree(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,8 +345,7 @@ static void *z_decomp_alloc(unsigned char *options, int opt_len)
|
||||||
|
|
||||||
state->w_size = w_size;
|
state->w_size = w_size;
|
||||||
state->strm.next_out = NULL;
|
state->strm.next_out = NULL;
|
||||||
state->strm.workspace = kmalloc(zlib_inflate_workspacesize(),
|
state->strm.workspace = vmalloc(zlib_inflate_workspacesize());
|
||||||
GFP_KERNEL|__GFP_REPEAT);
|
|
||||||
if (state->strm.workspace == NULL)
|
if (state->strm.workspace == NULL)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
|
|
|
@ -742,7 +742,7 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
|
||||||
msleep(2);
|
msleep(2);
|
||||||
for (i = 0; i < 5; i++) {
|
for (i = 0; i < 5; i++) {
|
||||||
udelay(100);
|
udelay(100);
|
||||||
if (!(RTL_R32(ERIDR) & ERIAR_FLAG))
|
if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,7 @@ static int rionet_close(struct net_device *ndev)
|
||||||
|
|
||||||
static void rionet_remove(struct rio_dev *rdev)
|
static void rionet_remove(struct rio_dev *rdev)
|
||||||
{
|
{
|
||||||
struct net_device *ndev = NULL;
|
struct net_device *ndev = rio_get_drvdata(rdev);
|
||||||
struct rionet_peer *peer, *tmp;
|
struct rionet_peer *peer, *tmp;
|
||||||
|
|
||||||
free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ?
|
free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ?
|
||||||
|
@ -433,22 +433,12 @@ static const struct net_device_ops rionet_netdev_ops = {
|
||||||
.ndo_set_mac_address = eth_mac_addr,
|
.ndo_set_mac_address = eth_mac_addr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rionet_setup_netdev(struct rio_mport *mport)
|
static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct net_device *ndev = NULL;
|
|
||||||
struct rionet_private *rnet;
|
struct rionet_private *rnet;
|
||||||
u16 device_id;
|
u16 device_id;
|
||||||
|
|
||||||
/* Allocate our net_device structure */
|
|
||||||
ndev = alloc_etherdev(sizeof(struct rionet_private));
|
|
||||||
if (ndev == NULL) {
|
|
||||||
printk(KERN_INFO "%s: could not allocate ethernet device.\n",
|
|
||||||
DRV_NAME);
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL,
|
rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL,
|
||||||
mport->sys_size ? __fls(sizeof(void *)) + 4 : 0);
|
mport->sys_size ? __fls(sizeof(void *)) + 4 : 0);
|
||||||
if (!rionet_active) {
|
if (!rionet_active) {
|
||||||
|
@ -504,11 +494,21 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
|
||||||
int rc = -ENODEV;
|
int rc = -ENODEV;
|
||||||
u32 lpef, lsrc_ops, ldst_ops;
|
u32 lpef, lsrc_ops, ldst_ops;
|
||||||
struct rionet_peer *peer;
|
struct rionet_peer *peer;
|
||||||
|
struct net_device *ndev = NULL;
|
||||||
|
|
||||||
/* If local device is not rionet capable, give up quickly */
|
/* If local device is not rionet capable, give up quickly */
|
||||||
if (!rionet_capable)
|
if (!rionet_capable)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* Allocate our net_device structure */
|
||||||
|
ndev = alloc_etherdev(sizeof(struct rionet_private));
|
||||||
|
if (ndev == NULL) {
|
||||||
|
printk(KERN_INFO "%s: could not allocate ethernet device.\n",
|
||||||
|
DRV_NAME);
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First time through, make sure local device is rionet
|
* First time through, make sure local device is rionet
|
||||||
* capable, setup netdev, and set flags so this is skipped
|
* capable, setup netdev, and set flags so this is skipped
|
||||||
|
@ -529,7 +529,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = rionet_setup_netdev(rdev->net->hport);
|
rc = rionet_setup_netdev(rdev->net->hport, ndev);
|
||||||
rionet_check = 1;
|
rionet_check = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,6 +546,8 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
|
||||||
list_add_tail(&peer->node, &rionet_peers);
|
list_add_tail(&peer->node, &rionet_peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rio_set_drvdata(rdev, ndev);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,34 +100,42 @@ kalmia_send_init_packet(struct usbnet *dev, u8 *init_msg, u8 init_msg_len,
|
||||||
static int
|
static int
|
||||||
kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr)
|
kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr)
|
||||||
{
|
{
|
||||||
char init_msg_1[] =
|
const static char init_msg_1[] =
|
||||||
{ 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
|
{ 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
|
||||||
0x00, 0x00 };
|
0x00, 0x00 };
|
||||||
char init_msg_2[] =
|
const static char init_msg_2[] =
|
||||||
{ 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4,
|
{ 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4,
|
||||||
0x00, 0x00 };
|
0x00, 0x00 };
|
||||||
char receive_buf[28];
|
const static int buflen = 28;
|
||||||
|
char *usb_buf;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = kalmia_send_init_packet(dev, init_msg_1, sizeof(init_msg_1)
|
usb_buf = kmalloc(buflen, GFP_DMA | GFP_KERNEL);
|
||||||
/ sizeof(init_msg_1[0]), receive_buf, 24);
|
if (!usb_buf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memcpy(usb_buf, init_msg_1, 12);
|
||||||
|
status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_1)
|
||||||
|
/ sizeof(init_msg_1[0]), usb_buf, 24);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
status = kalmia_send_init_packet(dev, init_msg_2, sizeof(init_msg_2)
|
memcpy(usb_buf, init_msg_2, 12);
|
||||||
/ sizeof(init_msg_2[0]), receive_buf, 28);
|
status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_2)
|
||||||
|
/ sizeof(init_msg_2[0]), usb_buf, 28);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
memcpy(ethernet_addr, receive_buf + 10, ETH_ALEN);
|
memcpy(ethernet_addr, usb_buf + 10, ETH_ALEN);
|
||||||
|
|
||||||
|
kfree(usb_buf);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
kalmia_bind(struct usbnet *dev, struct usb_interface *intf)
|
kalmia_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
u8 status;
|
int status;
|
||||||
u8 ethernet_addr[ETH_ALEN];
|
u8 ethernet_addr[ETH_ALEN];
|
||||||
|
|
||||||
/* Don't bind to AT command interface */
|
/* Don't bind to AT command interface */
|
||||||
|
@ -190,7 +198,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
skb = skb2;
|
skb = skb2;
|
||||||
|
|
||||||
done: header_start = skb_push(skb, KALMIA_HEADER_LENGTH);
|
done:
|
||||||
|
header_start = skb_push(skb, KALMIA_HEADER_LENGTH);
|
||||||
ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12];
|
ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12];
|
||||||
ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13];
|
ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13];
|
||||||
|
|
||||||
|
@ -201,9 +210,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
|
||||||
header_start[0] = 0x57;
|
header_start[0] = 0x57;
|
||||||
header_start[1] = 0x44;
|
header_start[1] = 0x44;
|
||||||
content_len = skb->len - KALMIA_HEADER_LENGTH;
|
content_len = skb->len - KALMIA_HEADER_LENGTH;
|
||||||
header_start[2] = (content_len & 0xff); /* low byte */
|
|
||||||
header_start[3] = (content_len >> 8); /* high byte */
|
|
||||||
|
|
||||||
|
put_unaligned_le16(content_len, &header_start[2]);
|
||||||
header_start[4] = ether_type_1;
|
header_start[4] = ether_type_1;
|
||||||
header_start[5] = ether_type_2;
|
header_start[5] = ether_type_2;
|
||||||
|
|
||||||
|
@ -231,13 +239,13 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||||
* Our task here is to strip off framing, leaving skb with one
|
* Our task here is to strip off framing, leaving skb with one
|
||||||
* data frame for the usbnet framework code to process.
|
* data frame for the usbnet framework code to process.
|
||||||
*/
|
*/
|
||||||
const u8 HEADER_END_OF_USB_PACKET[] =
|
const static u8 HEADER_END_OF_USB_PACKET[] =
|
||||||
{ 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 };
|
{ 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 };
|
||||||
const u8 EXPECTED_UNKNOWN_HEADER_1[] =
|
const static u8 EXPECTED_UNKNOWN_HEADER_1[] =
|
||||||
{ 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 };
|
{ 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 };
|
||||||
const u8 EXPECTED_UNKNOWN_HEADER_2[] =
|
const static u8 EXPECTED_UNKNOWN_HEADER_2[] =
|
||||||
{ 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 };
|
{ 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 };
|
||||||
u8 i = 0;
|
int i = 0;
|
||||||
|
|
||||||
/* incomplete header? */
|
/* incomplete header? */
|
||||||
if (skb->len < KALMIA_HEADER_LENGTH)
|
if (skb->len < KALMIA_HEADER_LENGTH)
|
||||||
|
@ -285,7 +293,7 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||||
|
|
||||||
/* subtract start header and end header */
|
/* subtract start header and end header */
|
||||||
usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH);
|
usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH);
|
||||||
ether_packet_length = header_start[2] + (header_start[3] << 8);
|
ether_packet_length = get_unaligned_le16(&header_start[2]);
|
||||||
skb_pull(skb, KALMIA_HEADER_LENGTH);
|
skb_pull(skb, KALMIA_HEADER_LENGTH);
|
||||||
|
|
||||||
/* Some small packets misses end marker */
|
/* Some small packets misses end marker */
|
||||||
|
|
|
@ -331,17 +331,7 @@ static const struct usb_device_id products [] = {
|
||||||
ZAURUS_MASTER_INTERFACE,
|
ZAURUS_MASTER_INTERFACE,
|
||||||
.driver_info = ZAURUS_PXA_INFO,
|
.driver_info = ZAURUS_PXA_INFO,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/* At least some of the newest PXA units have very different lies about
|
|
||||||
* their standards support: they claim to be cell phones offering
|
|
||||||
* direct access to their radios! (No, they don't conform to CDC MDLM.)
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
|
||||||
USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &bogus_mdlm_info,
|
|
||||||
}, {
|
|
||||||
/* Motorola MOTOMAGX phones */
|
/* Motorola MOTOMAGX phones */
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
|
USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||||
|
|
|
@ -1624,6 +1624,16 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
||||||
pci_read_config_byte(pdev, 0x8, &revisionid);
|
pci_read_config_byte(pdev, 0x8, &revisionid);
|
||||||
pci_read_config_word(pdev, 0x3C, &irqline);
|
pci_read_config_word(pdev, 0x3C, &irqline);
|
||||||
|
|
||||||
|
/* PCI ID 0x10ec:0x8192 occurs for both RTL8192E, which uses
|
||||||
|
* r8192e_pci, and RTL8192SE, which uses this driver. If the
|
||||||
|
* revision ID is RTL_PCI_REVISION_ID_8192PCIE (0x01), then
|
||||||
|
* the correct driver is r8192e_pci, thus this routine should
|
||||||
|
* return false.
|
||||||
|
*/
|
||||||
|
if (deviceid == RTL_PCI_8192SE_DID &&
|
||||||
|
revisionid == RTL_PCI_REVISION_ID_8192PCIE)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (deviceid == RTL_PCI_8192_DID ||
|
if (deviceid == RTL_PCI_8192_DID ||
|
||||||
deviceid == RTL_PCI_0044_DID ||
|
deviceid == RTL_PCI_0044_DID ||
|
||||||
deviceid == RTL_PCI_0047_DID ||
|
deviceid == RTL_PCI_0047_DID ||
|
||||||
|
@ -1856,7 +1866,8 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
|
||||||
pci_write_config_byte(pdev, 0x04, 0x07);
|
pci_write_config_byte(pdev, 0x04, 0x07);
|
||||||
|
|
||||||
/* find adapter */
|
/* find adapter */
|
||||||
_rtl_pci_find_adapter(pdev, hw);
|
if (!_rtl_pci_find_adapter(pdev, hw))
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
/* Init IO handler */
|
/* Init IO handler */
|
||||||
_rtl_pci_io_handler_init(&pdev->dev, hw);
|
_rtl_pci_io_handler_init(&pdev->dev, hw);
|
||||||
|
|
|
@ -53,6 +53,8 @@ MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
|
||||||
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||||
{
|
{
|
||||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||||
|
const struct firmware *firmware;
|
||||||
|
int err;
|
||||||
|
|
||||||
rtlpriv->dm.dm_initialgain_enable = 1;
|
rtlpriv->dm.dm_initialgain_enable = 1;
|
||||||
rtlpriv->dm.dm_flag = 0;
|
rtlpriv->dm.dm_flag = 0;
|
||||||
|
@ -64,6 +66,24 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||||
("Can't alloc buffer for fw.\n"));
|
("Can't alloc buffer for fw.\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/* request fw */
|
||||||
|
err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
|
||||||
|
rtlpriv->io.dev);
|
||||||
|
if (err) {
|
||||||
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||||
|
("Failed to request firmware!\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (firmware->size > 0x4000) {
|
||||||
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||||
|
("Firmware is too big!\n"));
|
||||||
|
release_firmware(firmware);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||||
|
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||||
|
release_firmware(firmware);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -608,11 +608,11 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
|
||||||
goto encrypt;
|
goto encrypt;
|
||||||
|
|
||||||
auth:
|
auth:
|
||||||
if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
|
if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hci_conn_auth(conn, sec_level, auth_type);
|
if (!hci_conn_auth(conn, sec_level, auth_type))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
encrypt:
|
encrypt:
|
||||||
if (conn->link_mode & HCI_LM_ENCRYPT)
|
if (conn->link_mode & HCI_LM_ENCRYPT)
|
||||||
|
|
|
@ -4002,21 +4002,30 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||||
}
|
}
|
||||||
} else if (sk->sk_state == BT_CONNECT2) {
|
} else if (sk->sk_state == BT_CONNECT2) {
|
||||||
struct l2cap_conn_rsp rsp;
|
struct l2cap_conn_rsp rsp;
|
||||||
__u16 result;
|
__u16 res, stat;
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
sk->sk_state = BT_CONFIG;
|
if (bt_sk(sk)->defer_setup) {
|
||||||
result = L2CAP_CR_SUCCESS;
|
struct sock *parent = bt_sk(sk)->parent;
|
||||||
|
res = L2CAP_CR_PEND;
|
||||||
|
stat = L2CAP_CS_AUTHOR_PEND;
|
||||||
|
parent->sk_data_ready(parent, 0);
|
||||||
|
} else {
|
||||||
|
sk->sk_state = BT_CONFIG;
|
||||||
|
res = L2CAP_CR_SUCCESS;
|
||||||
|
stat = L2CAP_CS_NO_INFO;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sk->sk_state = BT_DISCONN;
|
sk->sk_state = BT_DISCONN;
|
||||||
l2cap_sock_set_timer(sk, HZ / 10);
|
l2cap_sock_set_timer(sk, HZ / 10);
|
||||||
result = L2CAP_CR_SEC_BLOCK;
|
res = L2CAP_CR_SEC_BLOCK;
|
||||||
|
stat = L2CAP_CS_NO_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp.scid = cpu_to_le16(chan->dcid);
|
rsp.scid = cpu_to_le16(chan->dcid);
|
||||||
rsp.dcid = cpu_to_le16(chan->scid);
|
rsp.dcid = cpu_to_le16(chan->scid);
|
||||||
rsp.result = cpu_to_le16(result);
|
rsp.result = cpu_to_le16(res);
|
||||||
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
rsp.status = cpu_to_le16(stat);
|
||||||
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
||||||
sizeof(rsp), &rsp);
|
sizeof(rsp), &rsp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1379,8 +1379,11 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br,
|
||||||
if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
|
if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (iph->protocol != IPPROTO_IGMP)
|
if (iph->protocol != IPPROTO_IGMP) {
|
||||||
|
if ((iph->daddr & IGMP_LOCAL_GROUP_MASK) != IGMP_LOCAL_GROUP)
|
||||||
|
BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
len = ntohs(iph->tot_len);
|
len = ntohs(iph->tot_len);
|
||||||
if (skb->len < len || len < ip_hdrlen(skb))
|
if (skb->len < len || len < ip_hdrlen(skb))
|
||||||
|
|
|
@ -802,8 +802,6 @@ static int __ip_append_data(struct sock *sk,
|
||||||
skb = skb_peek_tail(queue);
|
skb = skb_peek_tail(queue);
|
||||||
|
|
||||||
exthdrlen = !skb ? rt->dst.header_len : 0;
|
exthdrlen = !skb ? rt->dst.header_len : 0;
|
||||||
length += exthdrlen;
|
|
||||||
transhdrlen += exthdrlen;
|
|
||||||
mtu = cork->fragsize;
|
mtu = cork->fragsize;
|
||||||
|
|
||||||
hh_len = LL_RESERVED_SPACE(rt->dst.dev);
|
hh_len = LL_RESERVED_SPACE(rt->dst.dev);
|
||||||
|
@ -883,17 +881,16 @@ alloc_new_skb:
|
||||||
else
|
else
|
||||||
alloclen = fraglen;
|
alloclen = fraglen;
|
||||||
|
|
||||||
|
alloclen += exthdrlen;
|
||||||
|
|
||||||
/* The last fragment gets additional space at tail.
|
/* The last fragment gets additional space at tail.
|
||||||
* Note, with MSG_MORE we overallocate on fragments,
|
* Note, with MSG_MORE we overallocate on fragments,
|
||||||
* because we have no idea what fragment will be
|
* because we have no idea what fragment will be
|
||||||
* the last.
|
* the last.
|
||||||
*/
|
*/
|
||||||
if (datalen == length + fraggap) {
|
if (datalen == length + fraggap)
|
||||||
alloclen += rt->dst.trailer_len;
|
alloclen += rt->dst.trailer_len;
|
||||||
/* make sure mtu is not reached */
|
|
||||||
if (datalen > mtu - fragheaderlen - rt->dst.trailer_len)
|
|
||||||
datalen -= ALIGN(rt->dst.trailer_len, 8);
|
|
||||||
}
|
|
||||||
if (transhdrlen) {
|
if (transhdrlen) {
|
||||||
skb = sock_alloc_send_skb(sk,
|
skb = sock_alloc_send_skb(sk,
|
||||||
alloclen + hh_len + 15,
|
alloclen + hh_len + 15,
|
||||||
|
@ -926,11 +923,11 @@ alloc_new_skb:
|
||||||
/*
|
/*
|
||||||
* Find where to start putting bytes.
|
* Find where to start putting bytes.
|
||||||
*/
|
*/
|
||||||
data = skb_put(skb, fraglen);
|
data = skb_put(skb, fraglen + exthdrlen);
|
||||||
skb_set_network_header(skb, exthdrlen);
|
skb_set_network_header(skb, exthdrlen);
|
||||||
skb->transport_header = (skb->network_header +
|
skb->transport_header = (skb->network_header +
|
||||||
fragheaderlen);
|
fragheaderlen);
|
||||||
data += fragheaderlen;
|
data += fragheaderlen + exthdrlen;
|
||||||
|
|
||||||
if (fraggap) {
|
if (fraggap) {
|
||||||
skb->csum = skb_copy_and_csum_bits(
|
skb->csum = skb_copy_and_csum_bits(
|
||||||
|
@ -1064,7 +1061,7 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
|
||||||
*/
|
*/
|
||||||
*rtp = NULL;
|
*rtp = NULL;
|
||||||
cork->fragsize = inet->pmtudisc == IP_PMTUDISC_PROBE ?
|
cork->fragsize = inet->pmtudisc == IP_PMTUDISC_PROBE ?
|
||||||
rt->dst.dev->mtu : dst_mtu(rt->dst.path);
|
rt->dst.dev->mtu : dst_mtu(&rt->dst);
|
||||||
cork->dst = &rt->dst;
|
cork->dst = &rt->dst;
|
||||||
cork->length = 0;
|
cork->length = 0;
|
||||||
cork->tx_flags = ipc->tx_flags;
|
cork->tx_flags = ipc->tx_flags;
|
||||||
|
|
|
@ -17,51 +17,35 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
|
||||||
const struct iphdr *iph = ip_hdr(skb);
|
const struct iphdr *iph = ip_hdr(skb);
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
struct flowi4 fl4 = {};
|
struct flowi4 fl4 = {};
|
||||||
unsigned long orefdst;
|
__be32 saddr = iph->saddr;
|
||||||
|
__u8 flags = 0;
|
||||||
unsigned int hh_len;
|
unsigned int hh_len;
|
||||||
unsigned int type;
|
|
||||||
|
|
||||||
type = inet_addr_type(net, iph->saddr);
|
if (!skb->sk && addr_type != RTN_LOCAL) {
|
||||||
if (skb->sk && inet_sk(skb->sk)->transparent)
|
if (addr_type == RTN_UNSPEC)
|
||||||
type = RTN_LOCAL;
|
addr_type = inet_addr_type(net, saddr);
|
||||||
if (addr_type == RTN_UNSPEC)
|
if (addr_type == RTN_LOCAL || addr_type == RTN_UNICAST)
|
||||||
addr_type = type;
|
flags |= FLOWI_FLAG_ANYSRC;
|
||||||
|
else
|
||||||
|
saddr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* some non-standard hacks like ipt_REJECT.c:send_reset() can cause
|
/* some non-standard hacks like ipt_REJECT.c:send_reset() can cause
|
||||||
* packets with foreign saddr to appear on the NF_INET_LOCAL_OUT hook.
|
* packets with foreign saddr to appear on the NF_INET_LOCAL_OUT hook.
|
||||||
*/
|
*/
|
||||||
if (addr_type == RTN_LOCAL) {
|
fl4.daddr = iph->daddr;
|
||||||
fl4.daddr = iph->daddr;
|
fl4.saddr = saddr;
|
||||||
if (type == RTN_LOCAL)
|
fl4.flowi4_tos = RT_TOS(iph->tos);
|
||||||
fl4.saddr = iph->saddr;
|
fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0;
|
||||||
fl4.flowi4_tos = RT_TOS(iph->tos);
|
fl4.flowi4_mark = skb->mark;
|
||||||
fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0;
|
fl4.flowi4_flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : flags;
|
||||||
fl4.flowi4_mark = skb->mark;
|
rt = ip_route_output_key(net, &fl4);
|
||||||
fl4.flowi4_flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : 0;
|
if (IS_ERR(rt))
|
||||||
rt = ip_route_output_key(net, &fl4);
|
return -1;
|
||||||
if (IS_ERR(rt))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Drop old route. */
|
/* Drop old route. */
|
||||||
skb_dst_drop(skb);
|
skb_dst_drop(skb);
|
||||||
skb_dst_set(skb, &rt->dst);
|
skb_dst_set(skb, &rt->dst);
|
||||||
} else {
|
|
||||||
/* non-local src, find valid iif to satisfy
|
|
||||||
* rp-filter when calling ip_route_input. */
|
|
||||||
fl4.daddr = iph->saddr;
|
|
||||||
rt = ip_route_output_key(net, &fl4);
|
|
||||||
if (IS_ERR(rt))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
orefdst = skb->_skb_refdst;
|
|
||||||
if (ip_route_input(skb, iph->daddr, iph->saddr,
|
|
||||||
RT_TOS(iph->tos), rt->dst.dev) != 0) {
|
|
||||||
dst_release(&rt->dst);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
dst_release(&rt->dst);
|
|
||||||
refdst_drop(orefdst);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skb_dst(skb)->error)
|
if (skb_dst(skb)->error)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -40,7 +40,6 @@ static void send_reset(struct sk_buff *oldskb, int hook)
|
||||||
struct iphdr *niph;
|
struct iphdr *niph;
|
||||||
const struct tcphdr *oth;
|
const struct tcphdr *oth;
|
||||||
struct tcphdr _otcph, *tcph;
|
struct tcphdr _otcph, *tcph;
|
||||||
unsigned int addr_type;
|
|
||||||
|
|
||||||
/* IP header checks: fragment. */
|
/* IP header checks: fragment. */
|
||||||
if (ip_hdr(oldskb)->frag_off & htons(IP_OFFSET))
|
if (ip_hdr(oldskb)->frag_off & htons(IP_OFFSET))
|
||||||
|
@ -55,6 +54,9 @@ static void send_reset(struct sk_buff *oldskb, int hook)
|
||||||
if (oth->rst)
|
if (oth->rst)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (skb_rtable(oldskb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Check checksum */
|
/* Check checksum */
|
||||||
if (nf_ip_checksum(oldskb, hook, ip_hdrlen(oldskb), IPPROTO_TCP))
|
if (nf_ip_checksum(oldskb, hook, ip_hdrlen(oldskb), IPPROTO_TCP))
|
||||||
return;
|
return;
|
||||||
|
@ -101,19 +103,11 @@ static void send_reset(struct sk_buff *oldskb, int hook)
|
||||||
nskb->csum_start = (unsigned char *)tcph - nskb->head;
|
nskb->csum_start = (unsigned char *)tcph - nskb->head;
|
||||||
nskb->csum_offset = offsetof(struct tcphdr, check);
|
nskb->csum_offset = offsetof(struct tcphdr, check);
|
||||||
|
|
||||||
addr_type = RTN_UNSPEC;
|
|
||||||
if (hook != NF_INET_FORWARD
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
|| (nskb->nf_bridge && nskb->nf_bridge->mask & BRNF_BRIDGED)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
addr_type = RTN_LOCAL;
|
|
||||||
|
|
||||||
/* ip_route_me_harder expects skb->dst to be set */
|
/* ip_route_me_harder expects skb->dst to be set */
|
||||||
skb_dst_set_noref(nskb, skb_dst(oldskb));
|
skb_dst_set_noref(nskb, skb_dst(oldskb));
|
||||||
|
|
||||||
nskb->protocol = htons(ETH_P_IP);
|
nskb->protocol = htons(ETH_P_IP);
|
||||||
if (ip_route_me_harder(nskb, addr_type))
|
if (ip_route_me_harder(nskb, RTN_UNSPEC))
|
||||||
goto free_nskb;
|
goto free_nskb;
|
||||||
|
|
||||||
niph->ttl = ip4_dst_hoplimit(skb_dst(nskb));
|
niph->ttl = ip4_dst_hoplimit(skb_dst(nskb));
|
||||||
|
|
|
@ -1249,6 +1249,9 @@ csum_copy_err:
|
||||||
|
|
||||||
if (noblock)
|
if (noblock)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
|
/* starting over for a new packet */
|
||||||
|
msg->msg_flags &= ~MSG_TRUNC;
|
||||||
goto try_again;
|
goto try_again;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -453,8 +453,11 @@ csum_copy_err:
|
||||||
}
|
}
|
||||||
unlock_sock_fast(sk, slow);
|
unlock_sock_fast(sk, slow);
|
||||||
|
|
||||||
if (flags & MSG_DONTWAIT)
|
if (noblock)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
|
/* starting over for a new packet */
|
||||||
|
msg->msg_flags &= ~MSG_TRUNC;
|
||||||
goto try_again;
|
goto try_again;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue