Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
597e608a
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
597e608a
编写于
7月 07, 2010
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
上级
acbc0f03
33b665ee
变更
46
展开全部
隐藏空白更改
内联
并排
Showing
46 changed file
with
738 addition
and
439 deletion
+738
-439
drivers/bluetooth/bluecard_cs.c
drivers/bluetooth/bluecard_cs.c
+1
-1
drivers/bluetooth/hci_bcsp.c
drivers/bluetooth/hci_bcsp.c
+1
-1
drivers/isdn/gigaset/asyncdata.c
drivers/isdn/gigaset/asyncdata.c
+11
-33
drivers/isdn/gigaset/capi.c
drivers/isdn/gigaset/capi.c
+285
-120
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/common.c
+12
-24
drivers/isdn/gigaset/ev-layer.c
drivers/isdn/gigaset/ev-layer.c
+1
-3
drivers/isdn/gigaset/gigaset.h
drivers/isdn/gigaset/gigaset.h
+26
-12
drivers/isdn/gigaset/i4l.c
drivers/isdn/gigaset/i4l.c
+21
-0
drivers/isdn/gigaset/isocdata.c
drivers/isdn/gigaset/isocdata.c
+25
-47
drivers/isdn/hysdn/hysdn_net.c
drivers/isdn/hysdn/hysdn_net.c
+2
-1
drivers/net/bonding/bond_alb.c
drivers/net/bonding/bond_alb.c
+2
-1
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_main.c
+22
-11
drivers/net/cpmac.c
drivers/net/cpmac.c
+2
-1
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_main.c
+10
-7
drivers/net/ll_temac_main.c
drivers/net/ll_temac_main.c
+13
-5
drivers/net/mv643xx_eth.c
drivers/net/mv643xx_eth.c
+7
-2
drivers/net/ne.c
drivers/net/ne.c
+3
-1
drivers/net/pcmcia/smc91c92_cs.c
drivers/net/pcmcia/smc91c92_cs.c
+13
-5
drivers/net/phy/lxt.c
drivers/net/phy/lxt.c
+1
-0
drivers/net/qlge/qlge_main.c
drivers/net/qlge/qlge_main.c
+5
-6
drivers/net/s2io.c
drivers/net/s2io.c
+64
-37
drivers/net/s2io.h
drivers/net/s2io.h
+0
-4
drivers/net/sb1250-mac.c
drivers/net/sb1250-mac.c
+1
-0
drivers/net/usb/rndis_host.c
drivers/net/usb/rndis_host.c
+6
-12
drivers/net/usb/usbnet.c
drivers/net/usb/usbnet.c
+3
-2
drivers/net/virtio_net.c
drivers/net/virtio_net.c
+16
-12
drivers/net/vxge/vxge-main.c
drivers/net/vxge/vxge-main.c
+22
-11
drivers/vhost/net.c
drivers/vhost/net.c
+10
-2
drivers/vhost/vhost.c
drivers/vhost/vhost.c
+44
-42
drivers/vhost/vhost.h
drivers/vhost/vhost.h
+4
-4
include/linux/ethtool.h
include/linux/ethtool.h
+2
-0
include/linux/mv643xx_eth.h
include/linux/mv643xx_eth.h
+5
-0
include/linux/net.h
include/linux/net.h
+1
-2
include/linux/netdevice.h
include/linux/netdevice.h
+4
-1
include/net/sch_generic.h
include/net/sch_generic.h
+16
-4
include/net/xfrm.h
include/net/xfrm.h
+1
-1
net/bluetooth/bnep/netdev.c
net/bluetooth/bnep/netdev.c
+2
-0
net/bridge/br_multicast.c
net/bridge/br_multicast.c
+12
-9
net/bridge/br_netfilter.c
net/bridge/br_netfilter.c
+3
-0
net/core/dev.c
net/core/dev.c
+18
-0
net/core/ethtool.c
net/core/ethtool.c
+30
-11
net/ipv4/xfrm4_policy.c
net/ipv4/xfrm4_policy.c
+2
-0
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+1
-1
net/ipv6/netfilter/ip6t_REJECT.c
net/ipv6/netfilter/ip6t_REJECT.c
+4
-2
net/ipv6/xfrm6_policy.c
net/ipv6/xfrm6_policy.c
+2
-0
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_policy.c
+2
-1
未找到文件。
drivers/bluetooth/bluecard_cs.c
浏览文件 @
597e608a
...
...
@@ -37,7 +37,7 @@
#include <linux/wait.h>
#include <linux/skbuff.h>
#include <
asm
/io.h>
#include <
linux
/io.h>
#include <pcmcia/cs_types.h>
#include <pcmcia/cs.h>
...
...
drivers/bluetooth/hci_bcsp.c
浏览文件 @
597e608a
...
...
@@ -244,7 +244,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
if
(
rel
)
{
hdr
[
0
]
|=
0x80
+
bcsp
->
msgq_txseq
;
BT_DBG
(
"Sending packet with seqno %u"
,
bcsp
->
msgq_txseq
);
bcsp
->
msgq_txseq
=
++
(
bcsp
->
msgq_txseq
)
&
0x07
;
bcsp
->
msgq_txseq
=
(
bcsp
->
msgq_txseq
+
1
)
&
0x07
;
}
if
(
bcsp
->
use_crc
)
...
...
drivers/isdn/gigaset/asyncdata.c
浏览文件 @
597e608a
...
...
@@ -126,26 +126,6 @@ static unsigned lock_loop(unsigned numbytes, struct inbuf_t *inbuf)
return
numbytes
;
}
/* set up next receive skb for data mode
*/
static
void
new_rcv_skb
(
struct
bc_state
*
bcs
)
{
struct
cardstate
*
cs
=
bcs
->
cs
;
unsigned
short
hw_hdr_len
=
cs
->
hw_hdr_len
;
if
(
bcs
->
ignore
)
{
bcs
->
skb
=
NULL
;
return
;
}
bcs
->
skb
=
dev_alloc_skb
(
SBUFSIZE
+
hw_hdr_len
);
if
(
bcs
->
skb
==
NULL
)
{
dev_warn
(
cs
->
dev
,
"could not allocate new skb
\n
"
);
return
;
}
skb_reserve
(
bcs
->
skb
,
hw_hdr_len
);
}
/* process a block of received bytes in HDLC data mode
* (mstate != MS_LOCKED && !(inputstate & INS_command) && proto2 == L2_HDLC)
* Collect HDLC frames, undoing byte stuffing and watching for DLE escapes.
...
...
@@ -159,8 +139,8 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf)
struct
cardstate
*
cs
=
inbuf
->
cs
;
struct
bc_state
*
bcs
=
cs
->
bcs
;
int
inputstate
=
bcs
->
inputstate
;
__u16
fcs
=
bcs
->
fcs
;
struct
sk_buff
*
skb
=
bcs
->
skb
;
__u16
fcs
=
bcs
->
rx_
fcs
;
struct
sk_buff
*
skb
=
bcs
->
rx_
skb
;
unsigned
char
*
src
=
inbuf
->
data
+
inbuf
->
head
;
unsigned
procbytes
=
0
;
unsigned
char
c
;
...
...
@@ -245,8 +225,7 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf)
/* prepare reception of next frame */
inputstate
&=
~
INS_have_data
;
new_rcv_skb
(
bcs
);
skb
=
bcs
->
skb
;
skb
=
gigaset_new_rx_skb
(
bcs
);
}
else
{
/* empty frame (7E 7E) */
#ifdef CONFIG_GIGASET_DEBUG
...
...
@@ -255,8 +234,7 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf)
if
(
!
skb
)
{
/* skipped (?) */
gigaset_isdn_rcv_err
(
bcs
);
new_rcv_skb
(
bcs
);
skb
=
bcs
->
skb
;
skb
=
gigaset_new_rx_skb
(
bcs
);
}
}
...
...
@@ -279,11 +257,11 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf)
#endif
inputstate
|=
INS_have_data
;
if
(
skb
)
{
if
(
skb
->
len
==
SBUFSIZE
)
{
if
(
skb
->
len
>=
bcs
->
rx_bufsize
)
{
dev_warn
(
cs
->
dev
,
"received packet too long
\n
"
);
dev_kfree_skb_any
(
skb
);
/* skip remainder of packet */
bcs
->
skb
=
skb
=
NULL
;
bcs
->
rx_
skb
=
skb
=
NULL
;
}
else
{
*
__skb_put
(
skb
,
1
)
=
c
;
fcs
=
crc_ccitt_byte
(
fcs
,
c
);
...
...
@@ -292,7 +270,7 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf)
}
bcs
->
inputstate
=
inputstate
;
bcs
->
fcs
=
fcs
;
bcs
->
rx_
fcs
=
fcs
;
return
procbytes
;
}
...
...
@@ -308,18 +286,18 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf)
struct
cardstate
*
cs
=
inbuf
->
cs
;
struct
bc_state
*
bcs
=
cs
->
bcs
;
int
inputstate
=
bcs
->
inputstate
;
struct
sk_buff
*
skb
=
bcs
->
skb
;
struct
sk_buff
*
skb
=
bcs
->
rx_
skb
;
unsigned
char
*
src
=
inbuf
->
data
+
inbuf
->
head
;
unsigned
procbytes
=
0
;
unsigned
char
c
;
if
(
!
skb
)
{
/* skip this block */
new_rcv
_skb
(
bcs
);
gigaset_new_rx
_skb
(
bcs
);
return
numbytes
;
}
while
(
procbytes
<
numbytes
&&
skb
->
len
<
SBUFSIZE
)
{
while
(
procbytes
<
numbytes
&&
skb
->
len
<
bcs
->
rx_bufsize
)
{
c
=
*
src
++
;
procbytes
++
;
...
...
@@ -343,7 +321,7 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf)
if
(
inputstate
&
INS_have_data
)
{
gigaset_skb_rcvd
(
bcs
,
skb
);
inputstate
&=
~
INS_have_data
;
new_rcv
_skb
(
bcs
);
gigaset_new_rx
_skb
(
bcs
);
}
bcs
->
inputstate
=
inputstate
;
...
...
drivers/isdn/gigaset/capi.c
浏览文件 @
597e608a
此差异已折叠。
点击以展开。
drivers/isdn/gigaset/common.c
浏览文件 @
597e608a
...
...
@@ -399,8 +399,8 @@ static void gigaset_freebcs(struct bc_state *bcs)
gig_dbg
(
DEBUG_INIT
,
"clearing bcs[%d]->at_state"
,
bcs
->
channel
);
clear_at_state
(
&
bcs
->
at_state
);
gig_dbg
(
DEBUG_INIT
,
"freeing bcs[%d]->skb"
,
bcs
->
channel
);
dev_kfree_skb
(
bcs
->
skb
);
bcs
->
skb
=
NULL
;
dev_kfree_skb
(
bcs
->
rx_
skb
);
bcs
->
rx_
skb
=
NULL
;
for
(
i
=
0
;
i
<
AT_NUM
;
++
i
)
{
kfree
(
bcs
->
commands
[
i
]);
...
...
@@ -634,19 +634,10 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs,
bcs
->
emptycount
=
0
;
#endif
gig_dbg
(
DEBUG_INIT
,
"allocating bcs[%d]->skb"
,
channel
);
bcs
->
fcs
=
PPP_INITFCS
;
bcs
->
rx_bufsize
=
0
;
bcs
->
rx_skb
=
NULL
;
bcs
->
rx_fcs
=
PPP_INITFCS
;
bcs
->
inputstate
=
0
;
if
(
cs
->
ignoreframes
)
{
bcs
->
skb
=
NULL
;
}
else
{
bcs
->
skb
=
dev_alloc_skb
(
SBUFSIZE
+
cs
->
hw_hdr_len
);
if
(
bcs
->
skb
!=
NULL
)
skb_reserve
(
bcs
->
skb
,
cs
->
hw_hdr_len
);
else
pr_err
(
"out of memory
\n
"
);
}
bcs
->
channel
=
channel
;
bcs
->
cs
=
cs
;
...
...
@@ -658,16 +649,15 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs,
for
(
i
=
0
;
i
<
AT_NUM
;
++
i
)
bcs
->
commands
[
i
]
=
NULL
;
spin_lock_init
(
&
bcs
->
aplock
);
bcs
->
ap
=
NULL
;
bcs
->
apconnstate
=
0
;
gig_dbg
(
DEBUG_INIT
,
" setting up bcs[%d]->hw"
,
channel
);
if
(
cs
->
ops
->
initbcshw
(
bcs
))
return
bcs
;
gig_dbg
(
DEBUG_INIT
,
" failed"
);
gig_dbg
(
DEBUG_INIT
,
" freeing bcs[%d]->skb"
,
channel
);
dev_kfree_skb
(
bcs
->
skb
);
bcs
->
skb
=
NULL
;
return
NULL
;
}
...
...
@@ -839,14 +829,12 @@ void gigaset_bcs_reinit(struct bc_state *bcs)
bcs
->
emptycount
=
0
;
#endif
bcs
->
fcs
=
PPP_INITFCS
;
bcs
->
rx_
fcs
=
PPP_INITFCS
;
bcs
->
chstate
=
0
;
bcs
->
ignore
=
cs
->
ignoreframes
;
if
(
bcs
->
ignore
)
{
dev_kfree_skb
(
bcs
->
skb
);
bcs
->
skb
=
NULL
;
}
dev_kfree_skb
(
bcs
->
rx_skb
);
bcs
->
rx_skb
=
NULL
;
cs
->
ops
->
reinitbcshw
(
bcs
);
}
...
...
drivers/isdn/gigaset/ev-layer.c
浏览文件 @
597e608a
...
...
@@ -282,9 +282,7 @@ struct reply_t gigaset_tab_cid[] =
/* dial */
{
EV_DIAL
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
{
ACT_DIAL
}
},
{
RSP_INIT
,
0
,
0
,
SEQ_DIAL
,
601
,
5
,
{
ACT_CMD
+
AT_BC
}
},
{
RSP_OK
,
601
,
601
,
-
1
,
602
,
5
,
{
ACT_CMD
+
AT_HLC
}
},
{
RSP_NULL
,
602
,
602
,
-
1
,
603
,
5
,
{
ACT_CMD
+
AT_PROTO
}
},
{
RSP_OK
,
602
,
602
,
-
1
,
603
,
5
,
{
ACT_CMD
+
AT_PROTO
}
},
{
RSP_OK
,
601
,
601
,
-
1
,
603
,
5
,
{
ACT_CMD
+
AT_PROTO
}
},
{
RSP_OK
,
603
,
603
,
-
1
,
604
,
5
,
{
ACT_CMD
+
AT_TYPE
}
},
{
RSP_OK
,
604
,
604
,
-
1
,
605
,
5
,
{
ACT_CMD
+
AT_MSN
}
},
{
RSP_NULL
,
605
,
605
,
-
1
,
606
,
5
,
{
ACT_CMD
+
AT_CLIP
}
},
...
...
drivers/isdn/gigaset/gigaset.h
浏览文件 @
597e608a
...
...
@@ -45,10 +45,6 @@
#define MAX_EVENTS 64
/* size of event queue */
#define RBUFSIZE 8192
#define SBUFSIZE 4096
/* sk_buff payload size */
#define TRANSBUFSIZE 768
/* bytes per skb for transparent receive */
#define MAX_BUF_SIZE (SBUFSIZE - 2)
/* Max. size of a data packet from LL */
/* compile time options */
#define GIG_MAJOR 0
...
...
@@ -190,10 +186,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
#define AT_BC 3
#define AT_PROTO 4
#define AT_TYPE 5
#define AT_HLC 6
#define AT_CLIP 7
#define AT_CLIP 6
/* total number */
#define AT_NUM
8
#define AT_NUM
7
/* variables in struct at_state_t */
#define VAR_ZSAU 0
...
...
@@ -380,8 +375,10 @@ struct bc_state {
struct
at_state_t
at_state
;
__u16
fcs
;
struct
sk_buff
*
skb
;
/* receive buffer */
unsigned
rx_bufsize
;
/* max size accepted by application */
struct
sk_buff
*
rx_skb
;
__u16
rx_fcs
;
int
inputstate
;
/* see INS_XXXX */
int
channel
;
...
...
@@ -406,7 +403,9 @@ struct bc_state {
struct
bas_bc_state
*
bas
;
/* usb hardware driver (base) */
}
hw
;
void
*
ap
;
/* LL application structure */
void
*
ap
;
/* associated LL application */
int
apconnstate
;
/* LL application connection state */
spinlock_t
aplock
;
};
struct
cardstate
{
...
...
@@ -801,8 +800,23 @@ static inline void gigaset_bchannel_up(struct bc_state *bcs)
gigaset_schedule_event
(
bcs
->
cs
);
}
/* handling routines for sk_buff */
/* ============================= */
/* set up next receive skb for data mode */
static
inline
struct
sk_buff
*
gigaset_new_rx_skb
(
struct
bc_state
*
bcs
)
{
struct
cardstate
*
cs
=
bcs
->
cs
;
unsigned
short
hw_hdr_len
=
cs
->
hw_hdr_len
;
if
(
bcs
->
ignore
)
{
bcs
->
rx_skb
=
NULL
;
}
else
{
bcs
->
rx_skb
=
dev_alloc_skb
(
bcs
->
rx_bufsize
+
hw_hdr_len
);
if
(
bcs
->
rx_skb
==
NULL
)
dev_warn
(
cs
->
dev
,
"could not allocate skb
\n
"
);
else
skb_reserve
(
bcs
->
rx_skb
,
hw_hdr_len
);
}
return
bcs
->
rx_skb
;
}
/* append received bytes to inbuf */
int
gigaset_fill_inbuf
(
struct
inbuf_t
*
inbuf
,
const
unsigned
char
*
src
,
...
...
drivers/isdn/gigaset/i4l.c
浏览文件 @
597e608a
...
...
@@ -16,7 +16,10 @@
#include "gigaset.h"
#include <linux/isdnif.h>
#define SBUFSIZE 4096
/* sk_buff payload size */
#define TRANSBUFSIZE 768
/* bytes per skb for transparent receive */
#define HW_HDR_LEN 2
/* Header size used to store ack info */
#define MAX_BUF_SIZE (SBUFSIZE - HW_HDR_LEN)
/* max data packet from LL */
/* == Handling of I4L IO =====================================================*/
...
...
@@ -231,6 +234,15 @@ static int command_from_LL(isdn_ctrl *cntrl)
dev_err
(
cs
->
dev
,
"ISDN_CMD_DIAL: channel not free
\n
"
);
return
-
EBUSY
;
}
switch
(
bcs
->
proto2
)
{
case
L2_HDLC
:
bcs
->
rx_bufsize
=
SBUFSIZE
;
break
;
default:
/* assume transparent */
bcs
->
rx_bufsize
=
TRANSBUFSIZE
;
}
dev_kfree_skb
(
bcs
->
rx_skb
);
gigaset_new_rx_skb
(
bcs
);
commands
=
kzalloc
(
AT_NUM
*
(
sizeof
*
commands
),
GFP_ATOMIC
);
if
(
!
commands
)
{
...
...
@@ -314,6 +326,15 @@ static int command_from_LL(isdn_ctrl *cntrl)
return
-
EINVAL
;
}
bcs
=
cs
->
bcs
+
ch
;
switch
(
bcs
->
proto2
)
{
case
L2_HDLC
:
bcs
->
rx_bufsize
=
SBUFSIZE
;
break
;
default:
/* assume transparent */
bcs
->
rx_bufsize
=
TRANSBUFSIZE
;
}
dev_kfree_skb
(
bcs
->
rx_skb
);
gigaset_new_rx_skb
(
bcs
);
if
(
!
gigaset_add_event
(
cs
,
&
bcs
->
at_state
,
EV_ACCEPT
,
NULL
,
0
,
NULL
))
return
-
ENOMEM
;
...
...
drivers/isdn/gigaset/isocdata.c
浏览文件 @
597e608a
...
...
@@ -500,19 +500,18 @@ int gigaset_isoc_buildframe(struct bc_state *bcs, unsigned char *in, int len)
*/
static
inline
void
hdlc_putbyte
(
unsigned
char
c
,
struct
bc_state
*
bcs
)
{
bcs
->
fcs
=
crc_ccitt_byte
(
bcs
->
fcs
,
c
);
if
(
unlikely
(
bcs
->
skb
==
NULL
))
{
bcs
->
rx_fcs
=
crc_ccitt_byte
(
bcs
->
rx_
fcs
,
c
);
if
(
bcs
->
rx_skb
==
NULL
)
/* skipping */
return
;
}
if
(
unlikely
(
bcs
->
skb
->
len
==
SBUFSIZE
))
{
if
(
bcs
->
rx_skb
->
len
>=
bcs
->
rx_bufsize
)
{
dev_warn
(
bcs
->
cs
->
dev
,
"received oversized packet discarded
\n
"
);
bcs
->
hw
.
bas
->
giants
++
;
dev_kfree_skb_any
(
bcs
->
skb
);
bcs
->
skb
=
NULL
;
dev_kfree_skb_any
(
bcs
->
rx_
skb
);
bcs
->
rx_
skb
=
NULL
;
return
;
}
*
__skb_put
(
bcs
->
skb
,
1
)
=
c
;
*
__skb_put
(
bcs
->
rx_
skb
,
1
)
=
c
;
}
/* hdlc_flush
...
...
@@ -521,18 +520,13 @@ static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs)
static
inline
void
hdlc_flush
(
struct
bc_state
*
bcs
)
{
/* clear skb or allocate new if not skipping */
if
(
likely
(
bcs
->
skb
!=
NULL
))
skb_trim
(
bcs
->
skb
,
0
);
else
if
(
!
bcs
->
ignore
)
{
bcs
->
skb
=
dev_alloc_skb
(
SBUFSIZE
+
bcs
->
cs
->
hw_hdr_len
);
if
(
bcs
->
skb
)
skb_reserve
(
bcs
->
skb
,
bcs
->
cs
->
hw_hdr_len
);
else
dev_err
(
bcs
->
cs
->
dev
,
"could not allocate skb
\n
"
);
}
if
(
bcs
->
rx_skb
!=
NULL
)
skb_trim
(
bcs
->
rx_skb
,
0
);
else
gigaset_new_rx_skb
(
bcs
);
/* reset packet state */
bcs
->
fcs
=
PPP_INITFCS
;
bcs
->
rx_
fcs
=
PPP_INITFCS
;
}
/* hdlc_done
...
...
@@ -549,7 +543,7 @@ static inline void hdlc_done(struct bc_state *bcs)
hdlc_flush
(
bcs
);
return
;
}
procskb
=
bcs
->
skb
;
procskb
=
bcs
->
rx_
skb
;
if
(
procskb
==
NULL
)
{
/* previous error */
gig_dbg
(
DEBUG_ISO
,
"%s: skb=NULL"
,
__func__
);
...
...
@@ -560,8 +554,8 @@ static inline void hdlc_done(struct bc_state *bcs)
bcs
->
hw
.
bas
->
runts
++
;
dev_kfree_skb_any
(
procskb
);
gigaset_isdn_rcv_err
(
bcs
);
}
else
if
(
bcs
->
fcs
!=
PPP_GOODFCS
)
{
dev_notice
(
cs
->
dev
,
"frame check error
(0x%04x)
\n
"
,
bcs
->
fcs
);
}
else
if
(
bcs
->
rx_
fcs
!=
PPP_GOODFCS
)
{
dev_notice
(
cs
->
dev
,
"frame check error
\n
"
);
bcs
->
hw
.
bas
->
fcserrs
++
;
dev_kfree_skb_any
(
procskb
);
gigaset_isdn_rcv_err
(
bcs
);
...
...
@@ -574,13 +568,8 @@ static inline void hdlc_done(struct bc_state *bcs)
bcs
->
hw
.
bas
->
goodbytes
+=
len
;
gigaset_skb_rcvd
(
bcs
,
procskb
);
}
bcs
->
skb
=
dev_alloc_skb
(
SBUFSIZE
+
cs
->
hw_hdr_len
);
if
(
bcs
->
skb
)
skb_reserve
(
bcs
->
skb
,
cs
->
hw_hdr_len
);
else
dev_err
(
cs
->
dev
,
"could not allocate skb
\n
"
);
bcs
->
fcs
=
PPP_INITFCS
;
gigaset_new_rx_skb
(
bcs
);
bcs
->
rx_fcs
=
PPP_INITFCS
;
}
/* hdlc_frag
...
...
@@ -597,8 +586,8 @@ static inline void hdlc_frag(struct bc_state *bcs, unsigned inbits)
dev_notice
(
bcs
->
cs
->
dev
,
"received partial byte (%d bits)
\n
"
,
inbits
);
bcs
->
hw
.
bas
->
alignerrs
++
;
gigaset_isdn_rcv_err
(
bcs
);
__skb_trim
(
bcs
->
skb
,
0
);
bcs
->
fcs
=
PPP_INITFCS
;
__skb_trim
(
bcs
->
rx_
skb
,
0
);
bcs
->
rx_
fcs
=
PPP_INITFCS
;
}
/* bit counts lookup table for HDLC bit unstuffing
...
...
@@ -847,7 +836,6 @@ static inline void hdlc_unpack(unsigned char *src, unsigned count,
static
inline
void
trans_receive
(
unsigned
char
*
src
,
unsigned
count
,
struct
bc_state
*
bcs
)
{
struct
cardstate
*
cs
=
bcs
->
cs
;
struct
sk_buff
*
skb
;
int
dobytes
;
unsigned
char
*
dst
;
...
...
@@ -857,17 +845,11 @@ static inline void trans_receive(unsigned char *src, unsigned count,
hdlc_flush
(
bcs
);
return
;
}
skb
=
bcs
->
skb
;
if
(
unlikely
(
skb
==
NULL
))
{
bcs
->
skb
=
skb
=
dev_alloc_skb
(
SBUFSIZE
+
cs
->
hw_hdr_len
);
if
(
!
skb
)
{
dev_err
(
cs
->
dev
,
"could not allocate skb
\n
"
);
return
;
}
skb_reserve
(
skb
,
cs
->
hw_hdr_len
);
}
skb
=
bcs
->
rx_skb
;
if
(
skb
==
NULL
)
skb
=
gigaset_new_rx_skb
(
bcs
);
bcs
->
hw
.
bas
->
goodbytes
+=
skb
->
len
;
dobytes
=
TRANSBUFSIZE
-
skb
->
len
;
dobytes
=
bcs
->
rx_bufsize
-
skb
->
len
;
while
(
count
>
0
)
{
dst
=
skb_put
(
skb
,
count
<
dobytes
?
count
:
dobytes
);
while
(
count
>
0
&&
dobytes
>
0
)
{
...
...
@@ -879,14 +861,10 @@ static inline void trans_receive(unsigned char *src, unsigned count,
dump_bytes
(
DEBUG_STREAM_DUMP
,
"rcv data"
,
skb
->
data
,
skb
->
len
);
gigaset_skb_rcvd
(
bcs
,
skb
);
bcs
->
skb
=
skb
=
dev_alloc_skb
(
SBUFSIZE
+
cs
->
hw_hdr_len
);
if
(
!
skb
)
{
dev_err
(
cs
->
dev
,
"could not allocate skb
\n
"
);
skb
=
gigaset_new_rx_skb
(
bcs
);
if
(
skb
==
NULL
)
return
;
}
skb_reserve
(
skb
,
cs
->
hw_hdr_len
);
dobytes
=
TRANSBUFSIZE
;
dobytes
=
bcs
->
rx_bufsize
;
}
}
}
...
...
drivers/isdn/hysdn/hysdn_net.c
浏览文件 @
597e608a
...
...
@@ -187,12 +187,13 @@ void
hysdn_rx_netpkt
(
hysdn_card
*
card
,
unsigned
char
*
buf
,
unsigned
short
len
)
{
struct
net_local
*
lp
=
card
->
netif
;
struct
net_device
*
dev
=
lp
->
dev
;
struct
net_device
*
dev
;
struct
sk_buff
*
skb
;
if
(
!
lp
)
return
;
/* non existing device */
dev
=
lp
->
dev
;
dev
->
stats
.
rx_bytes
+=
len
;
skb
=
dev_alloc_skb
(
len
);
...
...
drivers/net/bonding/bond_alb.c
浏览文件 @
597e608a
...
...
@@ -333,7 +333,8 @@ static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
if
((
client_info
->
assigned
)
&&
(
client_info
->
ip_src
==
arp
->
ip_dst
)
&&
(
client_info
->
ip_dst
==
arp
->
ip_src
))
{
(
client_info
->
ip_dst
==
arp
->
ip_src
)
&&
(
compare_ether_addr_64bits
(
client_info
->
mac_dst
,
arp
->
mac_src
)))
{
/* update the clients MAC address */
memcpy
(
client_info
->
mac_dst
,
arp
->
mac_src
,
ETH_ALEN
);
client_info
->
ntt
=
1
;
...
...
drivers/net/bonding/bond_main.c
浏览文件 @
597e608a
...
...
@@ -176,7 +176,7 @@ static int arp_ip_count;
static
int
bond_mode
=
BOND_MODE_ROUNDROBIN
;
static
int
xmit_hashtype
=
BOND_XMIT_POLICY_LAYER2
;
static
int
lacp_fast
;
static
int
disable_netpoll
=
1
;
const
struct
bond_parm_tbl
bond_lacp_tbl
[]
=
{
{
"slow"
,
AD_LACP_SLOW
},
...
...
@@ -1766,15 +1766,23 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
bond_set_carrier
(
bond
);
#ifdef CONFIG_NET_POLL_CONTROLLER
if
(
slaves_support_netpoll
(
bond_dev
))
{
bond_dev
->
priv_flags
&=
~
IFF_DISABLE_NETPOLL
;
if
(
bond_dev
->
npinfo
)
slave_dev
->
npinfo
=
bond_dev
->
npinfo
;
}
else
if
(
!
(
bond_dev
->
priv_flags
&
IFF_DISABLE_NETPOLL
)
)
{
/*
* Netpoll and bonding is broken, make sure it is not initialized
* until it is fixed.
*/
if
(
disable_netpoll
)
{
bond_dev
->
priv_flags
|=
IFF_DISABLE_NETPOLL
;
pr_info
(
"New slave device %s does not support netpoll
\n
"
,
slave_dev
->
name
);
pr_info
(
"Disabling netpoll support for %s
\n
"
,
bond_dev
->
name
);
}
else
{
if
(
slaves_support_netpoll
(
bond_dev
))
{
bond_dev
->
priv_flags
&=
~
IFF_DISABLE_NETPOLL
;
if
(
bond_dev
->
npinfo
)
slave_dev
->
npinfo
=
bond_dev
->
npinfo
;
}
else
if
(
!
(
bond_dev
->
priv_flags
&
IFF_DISABLE_NETPOLL
))
{
bond_dev
->
priv_flags
|=
IFF_DISABLE_NETPOLL
;
pr_info
(
"New slave device %s does not support netpoll
\n
"
,
slave_dev
->
name
);
pr_info
(
"Disabling netpoll support for %s
\n
"
,
bond_dev
->
name
);
}
}
#endif
read_unlock
(
&
bond
->
lock
);
...
...
@@ -1977,8 +1985,11 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
#ifdef CONFIG_NET_POLL_CONTROLLER
read_lock_bh
(
&
bond
->
lock
);
if
(
slaves_support_netpoll
(
bond_dev
))
bond_dev
->
priv_flags
&=
~
IFF_DISABLE_NETPOLL
;
/* Make sure netpoll over stays disabled until fixed. */
if
(
!
disable_netpoll
)
if
(
slaves_support_netpoll
(
bond_dev
))
bond_dev
->
priv_flags
&=
~
IFF_DISABLE_NETPOLL
;
read_unlock_bh
(
&
bond
->
lock
);
if
(
slave_dev
->
netdev_ops
->
ndo_netpoll_cleanup
)
slave_dev
->
netdev_ops
->
ndo_netpoll_cleanup
(
slave_dev
);
...
...
drivers/net/cpmac.c
浏览文件 @
597e608a
...
...
@@ -1181,7 +1181,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
if
(
netif_msg_drv
(
priv
))
printk
(
KERN_ERR
"%s: Could not attach to PHY
\n
"
,
dev
->
name
);
return
PTR_ERR
(
priv
->
phy
);
rc
=
PTR_ERR
(
priv
->
phy
);
goto
fail
;
}
if
((
rc
=
register_netdev
(
dev
)))
{
...
...
drivers/net/ixgbe/ixgbe_main.c
浏览文件 @
597e608a
...
...
@@ -3741,10 +3741,6 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
/* signal that we are down to the interrupt handler */
set_bit
(
__IXGBE_DOWN
,
&
adapter
->
state
);
/* power down the optics */
if
(
hw
->
phy
.
multispeed_fiber
)
hw
->
mac
.
ops
.
disable_tx_laser
(
hw
);
/* disable receive for all VFs and wait one second */
if
(
adapter
->
num_vfs
)
{
/* ping all the active vfs to let them know we are going down */
...
...
@@ -3799,6 +3795,10 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
(
IXGBE_READ_REG
(
hw
,
IXGBE_DMATXCTL
)
&
~
IXGBE_DMATXCTL_TE
));
/* power down the optics */
if
(
hw
->
phy
.
multispeed_fiber
)
hw
->
mac
.
ops
.
disable_tx_laser
(
hw
);
/* clear n-tuple filters that are cached */
ethtool_ntuple_flush
(
netdev
);
...
...
@@ -4058,7 +4058,7 @@ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
done:
/* Notify the stack of the (possibly) reduced Tx Queue count. */
adapter
->
netdev
->
real_num_tx_queues
=
adapter
->
num_tx_queues
;
netif_set_real_num_tx_queues
(
adapter
->
netdev
,
adapter
->
num_tx_queues
)
;
}
static
void
ixgbe_acquire_msix_vectors
(
struct
ixgbe_adapter
*
adapter
,
...
...
@@ -5246,7 +5246,6 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
ixgbe_free_all_tx_resources
(
adapter
);
ixgbe_free_all_rx_resources
(
adapter
);
}
ixgbe_clear_interrupt_scheme
(
adapter
);
#ifdef CONFIG_PM
retval
=
pci_save_state
(
pdev
);
...
...
@@ -5281,6 +5280,8 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
*
enable_wake
=
!!
wufc
;
ixgbe_clear_interrupt_scheme
(
adapter
);
ixgbe_release_hw_control
(
adapter
);
pci_disable_device
(
pdev
);
...
...
@@ -6071,7 +6072,6 @@ static void ixgbe_tx_queue(struct ixgbe_adapter *adapter,
static
void
ixgbe_atr
(
struct
ixgbe_adapter
*
adapter
,
struct
sk_buff
*
skb
,
int
queue
,
u32
tx_flags
)
{
/* Right now, we support IPv4 only */
struct
ixgbe_atr_input
atr_input
;
struct
tcphdr
*
th
;
struct
iphdr
*
iph
=
ip_hdr
(
skb
);
...
...
@@ -6080,6 +6080,9 @@ static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb,
u32
src_ipv4_addr
,
dst_ipv4_addr
;
u8
l4type
=
0
;
/* Right now, we support IPv4 only */
if
(
skb
->
protocol
!=
htons
(
ETH_P_IP
))
return
;
/* check if we're UDP or TCP */
if
(
iph
->
protocol
==
IPPROTO_TCP
)
{
th
=
tcp_hdr
(
skb
);
...
...
drivers/net/ll_temac_main.c
浏览文件 @
597e608a
...
...
@@ -985,7 +985,7 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
np
=
of_parse_phandle
(
op
->
dev
.
of_node
,
"llink-connected"
,
0
);
if
(
!
np
)
{
dev_err
(
&
op
->
dev
,
"could not find DMA node
\n
"
);
goto
nodev
;
goto
err_iounmap
;
}
/* Setup the DMA register accesses, could be DCR or memory mapped */
...
...
@@ -999,7 +999,7 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
dev_dbg
(
&
op
->
dev
,
"MEM base: %p
\n
"
,
lp
->
sdma_regs
);
}
else
{
dev_err
(
&
op
->
dev
,
"unable to map DMA registers
\n
"
);
goto
nodev
;
goto
err_iounmap
;
}
}
...
...
@@ -1008,7 +1008,7 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
if
((
lp
->
rx_irq
==
NO_IRQ
)
||
(
lp
->
tx_irq
==
NO_IRQ
))
{
dev_err
(
&
op
->
dev
,
"could not determine irqs
\n
"
);
rc
=
-
ENOMEM
;
goto
nodev
;
goto
err_iounmap_2
;
}
of_node_put
(
np
);
/* Finished with the DMA node; drop the reference */
...
...
@@ -1018,7 +1018,7 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
if
((
!
addr
)
||
(
size
!=
6
))
{
dev_err
(
&
op
->
dev
,
"could not find MAC address
\n
"
);
rc
=
-
ENODEV
;
goto
nodev
;
goto
err_iounmap_2
;
}
temac_set_mac_address
(
ndev
,
(
void
*
)
addr
);
...
...
@@ -1034,7 +1034,7 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
rc
=
sysfs_create_group
(
&
lp
->
dev
->
kobj
,
&
temac_attr_group
);
if
(
rc
)
{
dev_err
(
lp
->
dev
,
"Error creating sysfs files
\n
"
);
goto
nodev
;
goto
err_iounmap_2
;
}
rc
=
register_netdev
(
lp
->
ndev
);
...
...
@@ -1047,6 +1047,11 @@ temac_of_probe(struct of_device *op, const struct of_device_id *match)
err_register_ndev:
sysfs_remove_group
(
&
lp
->
dev
->
kobj
,
&
temac_attr_group
);
err_iounmap_2:
if
(
lp
->
sdma_regs
)
iounmap
(
lp
->
sdma_regs
);
err_iounmap:
iounmap
(
lp
->
regs
);
nodev:
free_netdev
(
ndev
);
ndev
=
NULL
;
...
...
@@ -1065,6 +1070,9 @@ static int __devexit temac_of_remove(struct of_device *op)
of_node_put
(
lp
->
phy_node
);
lp
->
phy_node
=
NULL
;
dev_set_drvdata
(
&
op
->
dev
,
NULL
);
iounmap
(
lp
->
regs
);
if
(
lp
->
sdma_regs
)
iounmap
(
lp
->
sdma_regs
);
free_netdev
(
ndev
);
return
0
;
}
...
...
drivers/net/mv643xx_eth.c
浏览文件 @
597e608a
...
...
@@ -289,6 +289,7 @@ struct mv643xx_eth_shared_private {
unsigned
int
t_clk
;
int
extended_rx_coal_limit
;
int
tx_bw_control
;
int
tx_csum_limit
;
};
#define TX_BW_CONTROL_ABSENT 0
...
...
@@ -776,13 +777,16 @@ static int txq_submit_skb(struct tx_queue *txq, struct sk_buff *skb)
l4i_chk
=
0
;
if
(
skb
->
ip_summed
==
CHECKSUM_PARTIAL
)
{
int
hdr_len
;
int
tag_bytes
;
BUG_ON
(
skb
->
protocol
!=
htons
(
ETH_P_IP
)
&&
skb
->
protocol
!=
htons
(
ETH_P_8021Q
));
tag_bytes
=
(
void
*
)
ip_hdr
(
skb
)
-
(
void
*
)
skb
->
data
-
ETH_HLEN
;
if
(
unlikely
(
tag_bytes
&
~
12
))
{
hdr_len
=
(
void
*
)
ip_hdr
(
skb
)
-
(
void
*
)
skb
->
data
;
tag_bytes
=
hdr_len
-
ETH_HLEN
;
if
(
skb
->
len
-
hdr_len
>
mp
->
shared
->
tx_csum_limit
||
unlikely
(
tag_bytes
&
~
12
))
{
if
(
skb_checksum_help
(
skb
)
==
0
)
goto
no_csum
;
kfree_skb
(
skb
);
...
...
@@ -2671,6 +2675,7 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)
* Detect hardware parameters.
*/
msp
->
t_clk
=
(
pd
!=
NULL
&&
pd
->
t_clk
!=
0
)
?
pd
->
t_clk
:
133000000
;
msp
->
tx_csum_limit
=
pd
->
tx_csum_limit
?
pd
->
tx_csum_limit
:
9
*
1024
;
infer_hw_params
(
msp
);
platform_set_drvdata
(
pdev
,
msp
);
...
...
drivers/net/ne.c
浏览文件 @
597e608a
...
...
@@ -806,8 +806,10 @@ static int __init ne_drv_probe(struct platform_device *pdev)
dev
->
base_addr
=
res
->
start
;
dev
->
irq
=
platform_get_irq
(
pdev
,
0
);
}
else
{
if
(
this_dev
<
0
||
this_dev
>=
MAX_NE_CARDS
)
if
(
this_dev
<
0
||
this_dev
>=
MAX_NE_CARDS
)
{
free_netdev
(
dev
);
return
-
EINVAL
;
}
dev
->
base_addr
=
io
[
this_dev
];
dev
->
irq
=
irq
[
this_dev
];
dev
->
mem_end
=
bad
[
this_dev
];
...
...
drivers/net/pcmcia/smc91c92_cs.c
浏览文件 @
597e608a
...
...
@@ -1505,12 +1505,20 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id)
writeb
(
cor
&
~
COR_IREQ_ENA
,
smc
->
base
+
MOT_LAN
+
CISREG_COR
);
writeb
(
cor
,
smc
->
base
+
MOT_LAN
+
CISREG_COR
);
}
#ifdef DOES_NOT_WORK
if
(
smc
->
base
!=
NULL
)
{
/* Megahertz MFC's */
readb
(
smc
->
base
+
MEGAHERTZ_ISR
);
readb
(
smc
->
base
+
MEGAHERTZ_ISR
);
if
((
smc
->
base
!=
NULL
)
&&
/* Megahertz MFC's */
(
smc
->
manfid
==
MANFID_MEGAHERTZ
)
&&
(
smc
->
cardid
==
PRODID_MEGAHERTZ_EM3288
))
{
u_char
tmp
;
tmp
=
readb
(
smc
->
base
+
MEGAHERTZ_ISR
);
tmp
=
readb
(
smc
->
base
+
MEGAHERTZ_ISR
);
/* Retrigger interrupt if needed */
writeb
(
tmp
,
smc
->
base
+
MEGAHERTZ_ISR
);
writeb
(
tmp
,
smc
->
base
+
MEGAHERTZ_ISR
);
}
#endif
spin_unlock
(
&
smc
->
lock
);
return
IRQ_RETVAL
(
handled
);
}
...
...
drivers/net/phy/lxt.c
浏览文件 @
597e608a
...
...
@@ -226,6 +226,7 @@ module_exit(lxt_exit);
static
struct
mdio_device_id
lxt_tbl
[]
=
{
{
0x78100000
,
0xfffffff0
},
{
0x001378e0
,
0xfffffff0
},
{
0x00137a10
,
0xfffffff0
},
{
}
};
...
...
drivers/net/qlge/qlge_main.c
浏览文件 @
597e608a
...
...
@@ -4642,8 +4642,7 @@ static void ql_timer(unsigned long data)
return
;
}
qdev
->
timer
.
expires
=
jiffies
+
(
5
*
HZ
);
add_timer
(
&
qdev
->
timer
);
mod_timer
(
&
qdev
->
timer
,
jiffies
+
(
5
*
HZ
));
}
static
int
__devinit
qlge_probe
(
struct
pci_dev
*
pdev
,
...
...
@@ -4744,6 +4743,8 @@ static void ql_eeh_close(struct net_device *ndev)
netif_stop_queue
(
ndev
);
}
/* Disabling the timer */
del_timer_sync
(
&
qdev
->
timer
);
if
(
test_bit
(
QL_ADAPTER_UP
,
&
qdev
->
flags
))
cancel_delayed_work_sync
(
&
qdev
->
asic_reset_work
);
cancel_delayed_work_sync
(
&
qdev
->
mpi_reset_work
);
...
...
@@ -4839,8 +4840,7 @@ static void qlge_io_resume(struct pci_dev *pdev)
netif_err
(
qdev
,
ifup
,
qdev
->
ndev
,
"Device was not running prior to EEH.
\n
"
);
}
qdev
->
timer
.
expires
=
jiffies
+
(
5
*
HZ
);
add_timer
(
&
qdev
->
timer
);
mod_timer
(
&
qdev
->
timer
,
jiffies
+
(
5
*
HZ
));
netif_device_attach
(
ndev
);
}
...
...
@@ -4902,8 +4902,7 @@ static int qlge_resume(struct pci_dev *pdev)
return
err
;
}
qdev
->
timer
.
expires
=
jiffies
+
(
5
*
HZ
);
add_timer
(
&
qdev
->
timer
);
mod_timer
(
&
qdev
->
timer
,
jiffies
+
(
5
*
HZ
));
netif_device_attach
(
ndev
);
return
0
;
...
...
drivers/net/s2io.c
浏览文件 @
597e608a
...
...
@@ -3129,7 +3129,6 @@ static void tx_intr_handler(struct fifo_info *fifo_data)
pkt_cnt
++
;
/* Updating the statistics block */
nic
->
dev
->
stats
.
tx_bytes
+=
skb
->
len
;
swstats
->
mem_freed
+=
skb
->
truesize
;
dev_kfree_skb_irq
(
skb
);
...
...
@@ -4900,48 +4899,81 @@ static void s2io_updt_stats(struct s2io_nic *sp)
* Return value:
* pointer to the updated net_device_stats structure.
*/
static
struct
net_device_stats
*
s2io_get_stats
(
struct
net_device
*
dev
)
{
struct
s2io_nic
*
sp
=
netdev_priv
(
dev
);
struct
config_param
*
config
=
&
sp
->
config
;
struct
mac_info
*
mac_control
=
&
sp
->
mac_control
;
struct
stat_block
*
stats
=
mac_control
->
stats_info
;
int
i
;
u64
delta
;
/* Configure Stats for immediate updt */
s2io_updt_stats
(
sp
);
/* Using sp->stats as a staging area, because reset (due to mtu
change, for example) will clear some hardware counters */
dev
->
stats
.
tx_packets
+=
le32_to_cpu
(
stats
->
tmac_frms
)
-
sp
->
stats
.
tx_packets
;
sp
->
stats
.
tx_packets
=
le32_to_cpu
(
stats
->
tmac_frms
);
dev
->
stats
.
tx_errors
+=
le32_to_cpu
(
stats
->
tmac_any_err_frms
)
-
sp
->
stats
.
tx_errors
;
sp
->
stats
.
tx_errors
=
le32_to_cpu
(
stats
->
tmac_any_err_frms
);
dev
->
stats
.
rx_errors
+=
le64_to_cpu
(
stats
->
rmac_drop_frms
)
-
sp
->
stats
.
rx_errors
;
sp
->
stats
.
rx_errors
=
le64_to_cpu
(
stats
->
rmac_drop_frms
);
dev
->
stats
.
multicast
=
le32_to_cpu
(
stats
->
rmac_vld_mcst_frms
)
-
sp
->
stats
.
multicast
;
sp
->
stats
.
multicast
=
le32_to_cpu
(
stats
->
rmac_vld_mcst_frms
);
dev
->
stats
.
rx_length_errors
=
le64_to_cpu
(
stats
->
rmac_long_frms
)
-
sp
->
stats
.
rx_length_errors
;
sp
->
stats
.
rx_length_errors
=
le64_to_cpu
(
stats
->
rmac_long_frms
);
/* A device reset will cause the on-adapter statistics to be zero'ed.
* This can be done while running by changing the MTU. To prevent the
* system from having the stats zero'ed, the driver keeps a copy of the
* last update to the system (which is also zero'ed on reset). This
* enables the driver to accurately know the delta between the last
* update and the current update.
*/
delta
=
((
u64
)
le32_to_cpu
(
stats
->
rmac_vld_frms_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
rmac_vld_frms
))
-
sp
->
stats
.
rx_packets
;
sp
->
stats
.
rx_packets
+=
delta
;
dev
->
stats
.
rx_packets
+=
delta
;
delta
=
((
u64
)
le32_to_cpu
(
stats
->
tmac_frms_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
tmac_frms
))
-
sp
->
stats
.
tx_packets
;
sp
->
stats
.
tx_packets
+=
delta
;
dev
->
stats
.
tx_packets
+=
delta
;
delta
=
((
u64
)
le32_to_cpu
(
stats
->
rmac_data_octets_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
rmac_data_octets
))
-
sp
->
stats
.
rx_bytes
;
sp
->
stats
.
rx_bytes
+=
delta
;
dev
->
stats
.
rx_bytes
+=
delta
;
delta
=
((
u64
)
le32_to_cpu
(
stats
->
tmac_data_octets_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
tmac_data_octets
))
-
sp
->
stats
.
tx_bytes
;
sp
->
stats
.
tx_bytes
+=
delta
;
dev
->
stats
.
tx_bytes
+=
delta
;
delta
=
le64_to_cpu
(
stats
->
rmac_drop_frms
)
-
sp
->
stats
.
rx_errors
;
sp
->
stats
.
rx_errors
+=
delta
;
dev
->
stats
.
rx_errors
+=
delta
;
delta
=
((
u64
)
le32_to_cpu
(
stats
->
tmac_any_err_frms_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
tmac_any_err_frms
))
-
sp
->
stats
.
tx_errors
;
sp
->
stats
.
tx_errors
+=
delta
;
dev
->
stats
.
tx_errors
+=
delta
;
delta
=
le64_to_cpu
(
stats
->
rmac_drop_frms
)
-
sp
->
stats
.
rx_dropped
;
sp
->
stats
.
rx_dropped
+=
delta
;
dev
->
stats
.
rx_dropped
+=
delta
;
delta
=
le64_to_cpu
(
stats
->
tmac_drop_frms
)
-
sp
->
stats
.
tx_dropped
;
sp
->
stats
.
tx_dropped
+=
delta
;
dev
->
stats
.
tx_dropped
+=
delta
;
/* The adapter MAC interprets pause frames as multicast packets, but
* does not pass them up. This erroneously increases the multicast
* packet count and needs to be deducted when the multicast frame count
* is queried.
*/
delta
=
(
u64
)
le32_to_cpu
(
stats
->
rmac_vld_mcst_frms_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
rmac_vld_mcst_frms
);
delta
-=
le64_to_cpu
(
stats
->
rmac_pause_ctrl_frms
);
delta
-=
sp
->
stats
.
multicast
;
sp
->
stats
.
multicast
+=
delta
;
dev
->
stats
.
multicast
+=
delta
;
/* collect per-ring rx_packets and rx_bytes */
dev
->
stats
.
rx_packets
=
dev
->
stats
.
rx_bytes
=
0
;
for
(
i
=
0
;
i
<
config
->
rx_ring_num
;
i
++
)
{
struct
ring_info
*
ring
=
&
mac_control
->
rings
[
i
];
delta
=
((
u64
)
le32_to_cpu
(
stats
->
rmac_usized_frms_oflow
)
<<
32
|
le32_to_cpu
(
stats
->
rmac_usized_frms
))
+
le64_to_cpu
(
stats
->
rmac_long_frms
)
-
sp
->
stats
.
rx_length_errors
;
sp
->
stats
.
rx_length_errors
+=
delta
;
dev
->
stats
.
rx_length_errors
+=
delta
;
dev
->
stats
.
rx_packets
+=
ring
->
rx_packet
s
;
dev
->
stats
.
rx_bytes
+=
ring
->
rx_bytes
;
}
delta
=
le64_to_cpu
(
stats
->
rmac_fcs_err_frms
)
-
sp
->
stats
.
rx_crc_error
s
;
sp
->
stats
.
rx_crc_errors
+=
delta
;
dev
->
stats
.
rx_crc_errors
+=
delta
;
return
&
dev
->
stats
;
}
...
...
@@ -7494,15 +7526,11 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)
}
}
/* Updating statistics */
ring_data
->
rx_packets
++
;
rxdp
->
Host_Control
=
0
;
if
(
sp
->
rxd_mode
==
RXD_MODE_1
)
{
int
len
=
RXD_GET_BUFFER0_SIZE_1
(
rxdp
->
Control_2
);
ring_data
->
rx_bytes
+=
len
;
skb_put
(
skb
,
len
);
}
else
if
(
sp
->
rxd_mode
==
RXD_MODE_3B
)
{
int
get_block
=
ring_data
->
rx_curr_get_info
.
block_index
;
int
get_off
=
ring_data
->
rx_curr_get_info
.
offset
;
...
...
@@ -7511,7 +7539,6 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)
unsigned
char
*
buff
=
skb_push
(
skb
,
buf0_len
);
struct
buffAdd
*
ba
=
&
ring_data
->
ba
[
get_block
][
get_off
];
ring_data
->
rx_bytes
+=
buf0_len
+
buf2_len
;
memcpy
(
buff
,
ba
->
ba_0
,
buf0_len
);
skb_put
(
skb
,
buf2_len
);
}
...
...
drivers/net/s2io.h
浏览文件 @
597e608a
...
...
@@ -745,10 +745,6 @@ struct ring_info {
/* Buffer Address store. */
struct
buffAdd
**
ba
;
/* per-Ring statistics */
unsigned
long
rx_packets
;
unsigned
long
rx_bytes
;
}
____cacheline_aligned
;
/* Fifo specific structure */
...
...
drivers/net/sb1250-mac.c
浏览文件 @
597e608a
...
...
@@ -2671,6 +2671,7 @@ static struct platform_driver sbmac_driver = {
.
remove
=
__exit_p
(
sbmac_remove
),
.
driver
=
{
.
name
=
sbmac_string
,
.
owner
=
THIS_MODULE
,
},
};
...
...
drivers/net/usb/rndis_host.c
浏览文件 @
597e608a
...
...
@@ -104,10 +104,8 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg,
int
rndis_command
(
struct
usbnet
*
dev
,
struct
rndis_msg_hdr
*
buf
,
int
buflen
)
{
struct
cdc_state
*
info
=
(
void
*
)
&
dev
->
data
;
struct
usb_cdc_notification
notification
;
int
master_ifnum
;
int
retval
;
int
partial
;
unsigned
count
;
__le32
rsp
;
u32
xid
=
0
,
msg_len
,
request_id
;
...
...
@@ -135,17 +133,13 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
if
(
unlikely
(
retval
<
0
||
xid
==
0
))
return
retval
;
/* Some devices don't respond on the control channel until
* polled on the status channel, so do that first. */
retval
=
usb_interrupt_msg
(
dev
->
udev
,
usb_rcvintpipe
(
dev
->
udev
,
dev
->
status
->
desc
.
bEndpointAddress
),
&
notification
,
sizeof
(
notification
),
&
partial
,
RNDIS_CONTROL_TIMEOUT_MS
);
if
(
unlikely
(
retval
<
0
))
return
retval
;
// FIXME Seems like some devices discard responses when
// we time out and cancel our "get response" requests...
// so, this is fragile. Probably need to poll for status.
/* Poll the control channel; the request probably completed immediately */
/* ignore status endpoint, just poll the control channel;
* the request probably completed immediately
*/
rsp
=
buf
->
msg_type
|
RNDIS_MSG_COMPLETION
;
for
(
count
=
0
;
count
<
10
;
count
++
)
{
memset
(
buf
,
0
,
CONTROL_BUFFER_SIZE
);
...
...
drivers/net/usb/usbnet.c
浏览文件 @
597e608a
...
...
@@ -1293,6 +1293,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
goto
out
;
}
/* netdev_printk() needs this so do it as early as possible */
SET_NETDEV_DEV
(
net
,
&
udev
->
dev
);
dev
=
netdev_priv
(
net
);
dev
->
udev
=
xdev
;
dev
->
intf
=
udev
;
...
...
@@ -1377,8 +1380,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
dev
->
rx_urb_size
=
dev
->
hard_mtu
;
dev
->
maxpacket
=
usb_maxpacket
(
dev
->
udev
,
dev
->
out
,
1
);
SET_NETDEV_DEV
(
net
,
&
udev
->
dev
);
if
((
dev
->
driver_info
->
flags
&
FLAG_WLAN
)
!=
0
)
SET_NETDEV_DEVTYPE
(
net
,
&
wlan_type
);
if
((
dev
->
driver_info
->
flags
&
FLAG_WWAN
)
!=
0
)
...
...
drivers/net/virtio_net.c
浏览文件 @
597e608a
...
...
@@ -415,7 +415,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, gfp_t gfp)
static
bool
try_fill_recv
(
struct
virtnet_info
*
vi
,
gfp_t
gfp
)
{
int
err
;
bool
oom
=
false
;
bool
oom
;
do
{
if
(
vi
->
mergeable_rx_bufs
)
...
...
@@ -425,10 +425,9 @@ static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
else
err
=
add_recvbuf_small
(
vi
,
gfp
);
if
(
err
<
0
)
{
oom
=
true
;
oom
=
err
==
-
ENOMEM
;
if
(
err
<
0
)
break
;
}
++
vi
->
num
;
}
while
(
err
>
0
);
if
(
unlikely
(
vi
->
num
>
vi
->
max
))
...
...
@@ -563,7 +562,6 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
struct
virtnet_info
*
vi
=
netdev_priv
(
dev
);
int
capacity
;
again:
/* Free up any pending old buffers before queueing new ones. */
free_old_xmit_skbs
(
vi
);
...
...
@@ -572,14 +570,20 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
/* This can happen with OOM and indirect buffers. */
if
(
unlikely
(
capacity
<
0
))
{
netif_stop_queue
(
dev
);
dev_warn
(
&
dev
->
dev
,
"Unexpected full queue
\n
"
);
if
(
unlikely
(
!
virtqueue_enable_cb
(
vi
->
svq
)))
{
virtqueue_disable_cb
(
vi
->
svq
);
netif_start_queue
(
dev
);
goto
again
;
if
(
net_ratelimit
())
{
if
(
likely
(
capacity
==
-
ENOMEM
))
{
dev_warn
(
&
dev
->
dev
,
"TX queue failure: out of memory
\n
"
);
}
else
{
dev
->
stats
.
tx_fifo_errors
++
;
dev_warn
(
&
dev
->
dev
,
"Unexpected TX queue failure: %d
\n
"
,
capacity
);
}
}
return
NETDEV_TX_BUSY
;
dev
->
stats
.
tx_dropped
++
;
kfree_skb
(
skb
);
return
NETDEV_TX_OK
;
}
virtqueue_kick
(
vi
->
svq
);
...
...
drivers/net/vxge/vxge-main.c
浏览文件 @
597e608a
...
...
@@ -2262,7 +2262,8 @@ static int vxge_alloc_msix(struct vxgedev *vdev)
vxge_debug_init
(
VXGE_ERR
,
"%s: memory allocation failed"
,
VXGE_DRIVER_NAME
);
return
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
alloc_entries_failed
;
}
vdev
->
vxge_entries
=
...
...
@@ -2271,8 +2272,8 @@ static int vxge_alloc_msix(struct vxgedev *vdev)
if
(
!
vdev
->
vxge_entries
)
{
vxge_debug_init
(
VXGE_ERR
,
"%s: memory allocation failed"
,
VXGE_DRIVER_NAME
);
kfree
(
vdev
->
entries
)
;
return
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
alloc_vxge_entries_failed
;
}
for
(
i
=
0
,
j
=
0
;
i
<
vdev
->
no_of_vpath
;
i
++
)
{
...
...
@@ -2303,22 +2304,32 @@ static int vxge_alloc_msix(struct vxgedev *vdev)
vxge_debug_init
(
VXGE_ERR
,
"%s: MSI-X enable failed for %d vectors, ret: %d"
,
VXGE_DRIVER_NAME
,
vdev
->
intr_cnt
,
ret
);
if
((
max_config_vpath
!=
VXGE_USE_DEFAULT
)
||
(
ret
<
3
))
{
ret
=
-
ENODEV
;
goto
enable_msix_failed
;
}
kfree
(
vdev
->
entries
);
kfree
(
vdev
->
vxge_entries
);
vdev
->
entries
=
NULL
;
vdev
->
vxge_entries
=
NULL
;
if
((
max_config_vpath
!=
VXGE_USE_DEFAULT
)
||
(
ret
<
3
))
return
-
ENODEV
;
/* Try with less no of vector by reducing no of vpaths count */
temp
=
(
ret
-
1
)
/
2
;
vxge_close_vpaths
(
vdev
,
temp
);
vdev
->
no_of_vpath
=
temp
;
goto
start
;
}
else
if
(
ret
<
0
)
return
-
ENODEV
;
}
else
if
(
ret
<
0
)
{
ret
=
-
ENODEV
;
goto
enable_msix_failed
;
}
return
0
;
enable_msix_failed:
kfree
(
vdev
->
vxge_entries
);
alloc_vxge_entries_failed:
kfree
(
vdev
->
entries
);
alloc_entries_failed:
return
ret
;
}
static
int
vxge_enable_msix
(
struct
vxgedev
*
vdev
)
...
...
@@ -4515,9 +4526,9 @@ vxge_starter(void)
char
version
[
32
];
snprintf
(
version
,
32
,
"%s"
,
DRV_VERSION
);
printk
(
KERN_
CRIT
"%s: Copyright(c) 2002-2009 Neterion Inc
\n
"
,
printk
(
KERN_
INFO
"%s: Copyright(c) 2002-2009 Neterion Inc
\n
"
,
VXGE_DRIVER_NAME
);
printk
(
KERN_
CRIT
"%s: Driver version: %s
\n
"
,
printk
(
KERN_
INFO
"%s: Driver version: %s
\n
"
,
VXGE_DRIVER_NAME
,
version
);
verify_bandwidth
();
...
...
drivers/vhost/net.c
浏览文件 @
597e608a
...
...
@@ -98,7 +98,8 @@ static void tx_poll_start(struct vhost_net *net, struct socket *sock)
static
void
handle_tx
(
struct
vhost_net
*
net
)
{
struct
vhost_virtqueue
*
vq
=
&
net
->
dev
.
vqs
[
VHOST_NET_VQ_TX
];
unsigned
head
,
out
,
in
,
s
;
unsigned
out
,
in
,
s
;
int
head
;
struct
msghdr
msg
=
{
.
msg_name
=
NULL
,
.
msg_namelen
=
0
,
...
...
@@ -135,6 +136,9 @@ static void handle_tx(struct vhost_net *net)
ARRAY_SIZE
(
vq
->
iov
),
&
out
,
&
in
,
NULL
,
NULL
);
/* On error, stop handling until the next kick. */
if
(
unlikely
(
head
<
0
))
break
;
/* Nothing new? Wait for eventfd to tell us they refilled. */
if
(
head
==
vq
->
num
)
{
wmem
=
atomic_read
(
&
sock
->
sk
->
sk_wmem_alloc
);
...
...
@@ -192,7 +196,8 @@ static void handle_tx(struct vhost_net *net)
static
void
handle_rx
(
struct
vhost_net
*
net
)
{
struct
vhost_virtqueue
*
vq
=
&
net
->
dev
.
vqs
[
VHOST_NET_VQ_RX
];
unsigned
head
,
out
,
in
,
log
,
s
;
unsigned
out
,
in
,
log
,
s
;
int
head
;
struct
vhost_log
*
vq_log
;
struct
msghdr
msg
=
{
.
msg_name
=
NULL
,
...
...
@@ -228,6 +233,9 @@ static void handle_rx(struct vhost_net *net)
ARRAY_SIZE
(
vq
->
iov
),
&
out
,
&
in
,
vq_log
,
&
log
);
/* On error, stop handling until the next kick. */
if
(
unlikely
(
head
<
0
))
break
;
/* OK, now we need to know about added descriptors. */
if
(
head
==
vq
->
num
)
{
if
(
unlikely
(
vhost_enable_notify
(
vq
)))
{
...
...
drivers/vhost/vhost.c
浏览文件 @
597e608a
...
...
@@ -736,12 +736,12 @@ static int translate_desc(struct vhost_dev *dev, u64 addr, u32 len,
mem
=
rcu_dereference
(
dev
->
memory
);
while
((
u64
)
len
>
s
)
{
u64
size
;
if
(
ret
>=
iov_size
)
{
if
(
unlikely
(
ret
>=
iov_size
)
)
{
ret
=
-
ENOBUFS
;
break
;
}
reg
=
find_region
(
mem
,
addr
,
len
);
if
(
!
reg
)
{
if
(
unlikely
(
!
reg
)
)
{
ret
=
-
EFAULT
;
break
;
}
...
...
@@ -780,18 +780,18 @@ static unsigned next_desc(struct vring_desc *desc)
return
next
;
}
static
unsigned
get_indirect
(
struct
vhost_dev
*
dev
,
struct
vhost_virtqueue
*
vq
,
struct
iovec
iov
[],
unsigned
int
iov_size
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
,
struct
vring_desc
*
indirect
)
static
int
get_indirect
(
struct
vhost_dev
*
dev
,
struct
vhost_virtqueue
*
vq
,
struct
iovec
iov
[],
unsigned
int
iov_size
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
,
struct
vring_desc
*
indirect
)
{
struct
vring_desc
desc
;
unsigned
int
i
=
0
,
count
,
found
=
0
;
int
ret
;
/* Sanity check */
if
(
indirect
->
len
%
sizeof
desc
)
{
if
(
unlikely
(
indirect
->
len
%
sizeof
desc
)
)
{
vq_err
(
vq
,
"Invalid length in indirect descriptor: "
"len 0x%llx not multiple of 0x%zx
\n
"
,
(
unsigned
long
long
)
indirect
->
len
,
...
...
@@ -801,7 +801,7 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
ret
=
translate_desc
(
dev
,
indirect
->
addr
,
indirect
->
len
,
vq
->
indirect
,
ARRAY_SIZE
(
vq
->
indirect
));
if
(
ret
<
0
)
{
if
(
unlikely
(
ret
<
0
)
)
{
vq_err
(
vq
,
"Translation failure %d in indirect.
\n
"
,
ret
);
return
ret
;
}
...
...
@@ -813,7 +813,7 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
count
=
indirect
->
len
/
sizeof
desc
;
/* Buffers are chained via a 16 bit next field, so
* we can have at most 2^16 of these. */
if
(
count
>
USHRT_MAX
+
1
)
{
if
(
unlikely
(
count
>
USHRT_MAX
+
1
)
)
{
vq_err
(
vq
,
"Indirect buffer length too big: %d
\n
"
,
indirect
->
len
);
return
-
E2BIG
;
...
...
@@ -821,19 +821,19 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
do
{
unsigned
iov_count
=
*
in_num
+
*
out_num
;
if
(
++
found
>
count
)
{
if
(
unlikely
(
++
found
>
count
)
)
{
vq_err
(
vq
,
"Loop detected: last one at %u "
"indirect size %u
\n
"
,
i
,
count
);
return
-
EINVAL
;
}
if
(
memcpy_fromiovec
((
unsigned
char
*
)
&
desc
,
vq
->
indirect
,
sizeof
desc
))
{
if
(
unlikely
(
memcpy_fromiovec
((
unsigned
char
*
)
&
desc
,
vq
->
indirect
,
sizeof
desc
)
))
{
vq_err
(
vq
,
"Failed indirect descriptor: idx %d, %zx
\n
"
,
i
,
(
size_t
)
indirect
->
addr
+
i
*
sizeof
desc
);
return
-
EINVAL
;
}
if
(
desc
.
flags
&
VRING_DESC_F_INDIRECT
)
{
if
(
unlikely
(
desc
.
flags
&
VRING_DESC_F_INDIRECT
)
)
{
vq_err
(
vq
,
"Nested indirect descriptor: idx %d, %zx
\n
"
,
i
,
(
size_t
)
indirect
->
addr
+
i
*
sizeof
desc
);
return
-
EINVAL
;
...
...
@@ -841,7 +841,7 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
ret
=
translate_desc
(
dev
,
desc
.
addr
,
desc
.
len
,
iov
+
iov_count
,
iov_size
-
iov_count
);
if
(
ret
<
0
)
{
if
(
unlikely
(
ret
<
0
)
)
{
vq_err
(
vq
,
"Translation failure %d indirect idx %d
\n
"
,
ret
,
i
);
return
ret
;
...
...
@@ -857,7 +857,7 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
}
else
{
/* If it's an output descriptor, they're all supposed
* to come before any input descriptors. */
if
(
*
in_num
)
{
if
(
unlikely
(
*
in_num
)
)
{
vq_err
(
vq
,
"Indirect descriptor "
"has out after in: idx %d
\n
"
,
i
);
return
-
EINVAL
;
...
...
@@ -873,12 +873,13 @@ static unsigned get_indirect(struct vhost_dev *dev, struct vhost_virtqueue *vq,
* number of output then some number of input descriptors, it's actually two
* iovecs, but we pack them into one and note how many of each there were.
*
* This function returns the descriptor number found, or vq->num (which
* is never a valid descriptor number) if none was found. */
unsigned
vhost_get_vq_desc
(
struct
vhost_dev
*
dev
,
struct
vhost_virtqueue
*
vq
,
struct
iovec
iov
[],
unsigned
int
iov_size
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
)
* This function returns the descriptor number found, or vq->num (which is
* never a valid descriptor number) if none was found. A negative code is
* returned on error. */
int
vhost_get_vq_desc
(
struct
vhost_dev
*
dev
,
struct
vhost_virtqueue
*
vq
,
struct
iovec
iov
[],
unsigned
int
iov_size
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
)
{
struct
vring_desc
desc
;
unsigned
int
i
,
head
,
found
=
0
;
...
...
@@ -887,16 +888,16 @@ unsigned vhost_get_vq_desc(struct vhost_dev *dev, struct vhost_virtqueue *vq,
/* Check it isn't doing very strange things with descriptor numbers. */
last_avail_idx
=
vq
->
last_avail_idx
;
if
(
get_user
(
vq
->
avail_idx
,
&
vq
->
avail
->
idx
))
{
if
(
unlikely
(
get_user
(
vq
->
avail_idx
,
&
vq
->
avail
->
idx
)
))
{
vq_err
(
vq
,
"Failed to access avail idx at %p
\n
"
,
&
vq
->
avail
->
idx
);
return
vq
->
num
;
return
-
EFAULT
;
}
if
(
(
u16
)(
vq
->
avail_idx
-
last_avail_idx
)
>
vq
->
num
)
{
if
(
unlikely
((
u16
)(
vq
->
avail_idx
-
last_avail_idx
)
>
vq
->
num
)
)
{
vq_err
(
vq
,
"Guest moved used index from %u to %u"
,
last_avail_idx
,
vq
->
avail_idx
);
return
vq
->
num
;
return
-
EFAULT
;
}
/* If there's nothing new since last we looked, return invalid. */
...
...
@@ -908,18 +909,19 @@ unsigned vhost_get_vq_desc(struct vhost_dev *dev, struct vhost_virtqueue *vq,
/* Grab the next descriptor number they're advertising, and increment
* the index we've seen. */
if
(
get_user
(
head
,
&
vq
->
avail
->
ring
[
last_avail_idx
%
vq
->
num
]))
{
if
(
unlikely
(
get_user
(
head
,
&
vq
->
avail
->
ring
[
last_avail_idx
%
vq
->
num
])))
{
vq_err
(
vq
,
"Failed to read head: idx %d address %p
\n
"
,
last_avail_idx
,
&
vq
->
avail
->
ring
[
last_avail_idx
%
vq
->
num
]);
return
vq
->
num
;
return
-
EFAULT
;
}
/* If their number is silly, that's an error. */
if
(
head
>=
vq
->
num
)
{
if
(
unlikely
(
head
>=
vq
->
num
)
)
{
vq_err
(
vq
,
"Guest says index %u > %u is available"
,
head
,
vq
->
num
);
return
vq
->
num
;
return
-
EINVAL
;
}
/* When we start there are none of either input nor output. */
...
...
@@ -930,41 +932,41 @@ unsigned vhost_get_vq_desc(struct vhost_dev *dev, struct vhost_virtqueue *vq,
i
=
head
;
do
{
unsigned
iov_count
=
*
in_num
+
*
out_num
;
if
(
i
>=
vq
->
num
)
{
if
(
unlikely
(
i
>=
vq
->
num
)
)
{
vq_err
(
vq
,
"Desc index is %u > %u, head = %u"
,
i
,
vq
->
num
,
head
);
return
vq
->
num
;
return
-
EINVAL
;
}
if
(
++
found
>
vq
->
num
)
{
if
(
unlikely
(
++
found
>
vq
->
num
)
)
{
vq_err
(
vq
,
"Loop detected: last one at %u "
"vq size %u head %u
\n
"
,
i
,
vq
->
num
,
head
);
return
vq
->
num
;
return
-
EINVAL
;
}
ret
=
copy_from_user
(
&
desc
,
vq
->
desc
+
i
,
sizeof
desc
);
if
(
ret
)
{
if
(
unlikely
(
ret
)
)
{
vq_err
(
vq
,
"Failed to get descriptor: idx %d addr %p
\n
"
,
i
,
vq
->
desc
+
i
);
return
vq
->
num
;
return
-
EFAULT
;
}
if
(
desc
.
flags
&
VRING_DESC_F_INDIRECT
)
{
ret
=
get_indirect
(
dev
,
vq
,
iov
,
iov_size
,
out_num
,
in_num
,
log
,
log_num
,
&
desc
);
if
(
ret
<
0
)
{
if
(
unlikely
(
ret
<
0
)
)
{
vq_err
(
vq
,
"Failure detected "
"in indirect descriptor at idx %d
\n
"
,
i
);
return
vq
->
num
;
return
ret
;
}
continue
;
}
ret
=
translate_desc
(
dev
,
desc
.
addr
,
desc
.
len
,
iov
+
iov_count
,
iov_size
-
iov_count
);
if
(
ret
<
0
)
{
if
(
unlikely
(
ret
<
0
)
)
{
vq_err
(
vq
,
"Translation failure %d descriptor idx %d
\n
"
,
ret
,
i
);
return
vq
->
num
;
return
ret
;
}
if
(
desc
.
flags
&
VRING_DESC_F_WRITE
)
{
/* If this is an input descriptor,
...
...
@@ -978,10 +980,10 @@ unsigned vhost_get_vq_desc(struct vhost_dev *dev, struct vhost_virtqueue *vq,
}
else
{
/* If it's an output descriptor, they're all supposed
* to come before any input descriptors. */
if
(
*
in_num
)
{
if
(
unlikely
(
*
in_num
)
)
{
vq_err
(
vq
,
"Descriptor has out after in: "
"idx %d
\n
"
,
i
);
return
vq
->
num
;
return
-
EINVAL
;
}
*
out_num
+=
ret
;
}
...
...
drivers/vhost/vhost.h
浏览文件 @
597e608a
...
...
@@ -120,10 +120,10 @@ long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, unsigned long arg);
int
vhost_vq_access_ok
(
struct
vhost_virtqueue
*
vq
);
int
vhost_log_access_ok
(
struct
vhost_dev
*
);
unsigned
vhost_get_vq_desc
(
struct
vhost_dev
*
,
struct
vhost_virtqueue
*
,
struct
iovec
iov
[],
unsigned
int
iov_count
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
);
int
vhost_get_vq_desc
(
struct
vhost_dev
*
,
struct
vhost_virtqueue
*
,
struct
iovec
iov
[],
unsigned
int
iov_count
,
unsigned
int
*
out_num
,
unsigned
int
*
in_num
,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
);
void
vhost_discard_vq_desc
(
struct
vhost_virtqueue
*
);
int
vhost_add_used
(
struct
vhost_virtqueue
*
,
unsigned
int
head
,
int
len
);
...
...
include/linux/ethtool.h
浏览文件 @
597e608a
...
...
@@ -379,6 +379,8 @@ struct ethtool_rxnfc {
__u32
flow_type
;
/* The rx flow hash value or the rule DB size */
__u64
data
;
/* The following fields are not valid and must not be used for
* the ETHTOOL_{G,X}RXFH commands. */
struct
ethtool_rx_flow_spec
fs
;
__u32
rule_cnt
;
__u32
rule_locs
[
0
];
...
...
include/linux/mv643xx_eth.h
浏览文件 @
597e608a
...
...
@@ -19,6 +19,11 @@ struct mv643xx_eth_shared_platform_data {
struct
mbus_dram_target_info
*
dram
;
struct
platform_device
*
shared_smi
;
unsigned
int
t_clk
;
/*
* Max packet size for Tx IP/Layer 4 checksum, when set to 0, default
* limit of 9KiB will be used.
*/
int
tx_csum_limit
;
};
#define MV643XX_ETH_PHY_ADDR_DEFAULT 0
...
...
include/linux/net.h
浏览文件 @
597e608a
...
...
@@ -129,10 +129,9 @@ struct socket_wq {
* @type: socket type (%SOCK_STREAM, etc)
* @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)
* @ops: protocol specific socket operations
* @fasync_list: Asynchronous wake up list
* @file: File back pointer for gc
* @sk: internal networking protocol agnostic socket representation
* @w
ait
: wait queue for several uses
* @w
q
: wait queue for several uses
*/
struct
socket
{
socket_state
state
;
...
...
include/linux/netdevice.h
浏览文件 @
597e608a
...
...
@@ -1674,6 +1674,9 @@ static inline int netif_is_multiqueue(const struct net_device *dev)
return
(
dev
->
num_tx_queues
>
1
);
}
extern
void
netif_set_real_num_tx_queues
(
struct
net_device
*
dev
,
unsigned
int
txq
);
/* Use this variant when it is known for sure that it
* is executing from hardware interrupt context or with hardware interrupts
* disabled.
...
...
@@ -2360,7 +2363,7 @@ do { \
#endif
#if defined(VERBOSE_DEBUG)
#define netif_vdbg net
dev
_dbg
#define netif_vdbg net
if
_dbg
#else
#define netif_vdbg(priv, type, dev, format, args...) \
({ \
...
...
include/net/sch_generic.h
浏览文件 @
597e608a
...
...
@@ -336,12 +336,24 @@ extern void qdisc_calculate_pkt_len(struct sk_buff *skb,
extern
void
tcf_destroy
(
struct
tcf_proto
*
tp
);
extern
void
tcf_destroy_chain
(
struct
tcf_proto
**
fl
);
/* Reset all TX qdiscs of a device. */
/* Reset all TX qdiscs greater then index of a device. */
static
inline
void
qdisc_reset_all_tx_gt
(
struct
net_device
*
dev
,
unsigned
int
i
)
{
struct
Qdisc
*
qdisc
;
for
(;
i
<
dev
->
num_tx_queues
;
i
++
)
{
qdisc
=
netdev_get_tx_queue
(
dev
,
i
)
->
qdisc
;
if
(
qdisc
)
{
spin_lock_bh
(
qdisc_lock
(
qdisc
));
qdisc_reset
(
qdisc
);
spin_unlock_bh
(
qdisc_lock
(
qdisc
));
}
}
}
static
inline
void
qdisc_reset_all_tx
(
struct
net_device
*
dev
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
dev
->
num_tx_queues
;
i
++
)
qdisc_reset
(
netdev_get_tx_queue
(
dev
,
i
)
->
qdisc
);
qdisc_reset_all_tx_gt
(
dev
,
0
);
}
/* Are all TX queues of the device empty? */
...
...
include/net/xfrm.h
浏览文件 @
597e608a
...
...
@@ -1586,7 +1586,7 @@ static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb)
static
inline
int
xfrm_mark_get
(
struct
nlattr
**
attrs
,
struct
xfrm_mark
*
m
)
{
if
(
attrs
[
XFRMA_MARK
])
memcpy
(
m
,
nla_data
(
attrs
[
XFRMA_MARK
]),
sizeof
(
m
));
memcpy
(
m
,
nla_data
(
attrs
[
XFRMA_MARK
]),
sizeof
(
struct
xfrm_mark
));
else
m
->
v
=
m
->
m
=
0
;
...
...
net/bluetooth/bnep/netdev.c
浏览文件 @
597e608a
...
...
@@ -104,6 +104,8 @@ static void bnep_net_set_mc_list(struct net_device *dev)
break
;
memcpy
(
__skb_put
(
skb
,
ETH_ALEN
),
ha
->
addr
,
ETH_ALEN
);
memcpy
(
__skb_put
(
skb
,
ETH_ALEN
),
ha
->
addr
,
ETH_ALEN
);
i
++
;
}
r
->
len
=
htons
(
skb
->
len
-
len
);
}
...
...
net/bridge/br_multicast.c
浏览文件 @
597e608a
...
...
@@ -99,6 +99,15 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get(
return
NULL
;
}
static
struct
net_bridge_mdb_entry
*
br_mdb_ip_get
(
struct
net_bridge_mdb_htable
*
mdb
,
struct
br_ip
*
dst
)
{
if
(
!
mdb
)
return
NULL
;
return
__br_mdb_ip_get
(
mdb
,
dst
,
br_ip_hash
(
mdb
,
dst
));
}
static
struct
net_bridge_mdb_entry
*
br_mdb_ip4_get
(
struct
net_bridge_mdb_htable
*
mdb
,
__be32
dst
)
{
...
...
@@ -107,7 +116,7 @@ static struct net_bridge_mdb_entry *br_mdb_ip4_get(
br_dst
.
u
.
ip4
=
dst
;
br_dst
.
proto
=
htons
(
ETH_P_IP
);
return
__br_mdb_ip_get
(
mdb
,
&
br_dst
,
__br_ip4_hash
(
mdb
,
dst
)
);
return
br_mdb_ip_get
(
mdb
,
&
br_dst
);
}
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
...
...
@@ -119,23 +128,17 @@ static struct net_bridge_mdb_entry *br_mdb_ip6_get(
ipv6_addr_copy
(
&
br_dst
.
u
.
ip6
,
dst
);
br_dst
.
proto
=
htons
(
ETH_P_IPV6
);
return
__br_mdb_ip_get
(
mdb
,
&
br_dst
,
__br_ip6_hash
(
mdb
,
dst
)
);
return
br_mdb_ip_get
(
mdb
,
&
br_dst
);
}
#endif
static
struct
net_bridge_mdb_entry
*
br_mdb_ip_get
(
struct
net_bridge_mdb_htable
*
mdb
,
struct
br_ip
*
dst
)
{
return
__br_mdb_ip_get
(
mdb
,
dst
,
br_ip_hash
(
mdb
,
dst
));
}
struct
net_bridge_mdb_entry
*
br_mdb_get
(
struct
net_bridge
*
br
,
struct
sk_buff
*
skb
)
{
struct
net_bridge_mdb_htable
*
mdb
=
br
->
mdb
;
struct
br_ip
ip
;
if
(
!
mdb
||
br
->
multicast_disabled
)
if
(
br
->
multicast_disabled
)
return
NULL
;
if
(
BR_INPUT_SKB_CB
(
skb
)
->
igmp
)
...
...
net/bridge/br_netfilter.c
浏览文件 @
597e608a
...
...
@@ -598,6 +598,9 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb,
pskb_trim_rcsum
(
skb
,
len
);
/* BUG: Should really parse the IP options here. */
memset
(
IPCB
(
skb
),
0
,
sizeof
(
struct
inet_skb_parm
));
nf_bridge_put
(
skb
->
nf_bridge
);
if
(
!
nf_bridge_alloc
(
skb
))
return
NF_DROP
;
...
...
net/core/dev.c
浏览文件 @
597e608a
...
...
@@ -1550,6 +1550,24 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
rcu_read_unlock
();
}
/*
* Routine to help set real_num_tx_queues. To avoid skbs mapped to queues
* greater then real_num_tx_queues stale skbs on the qdisc must be flushed.
*/
void
netif_set_real_num_tx_queues
(
struct
net_device
*
dev
,
unsigned
int
txq
)
{
unsigned
int
real_num
=
dev
->
real_num_tx_queues
;
if
(
unlikely
(
txq
>
dev
->
num_tx_queues
))
;
else
if
(
txq
>
real_num
)
dev
->
real_num_tx_queues
=
txq
;
else
if
(
txq
<
real_num
)
{
dev
->
real_num_tx_queues
=
txq
;
qdisc_reset_all_tx_gt
(
dev
,
txq
);
}
}
EXPORT_SYMBOL
(
netif_set_real_num_tx_queues
);
static
inline
void
__netif_reschedule
(
struct
Qdisc
*
q
)
{
...
...
net/core/ethtool.c
浏览文件 @
597e608a
...
...
@@ -300,23 +300,33 @@ static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
}
static
noinline_for_stack
int
ethtool_set_rxnfc
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
u32
cmd
,
void
__user
*
useraddr
)
{
struct
ethtool_rxnfc
cmd
;
struct
ethtool_rxnfc
info
;
size_t
info_size
=
sizeof
(
info
);
if
(
!
dev
->
ethtool_ops
->
set_rxnfc
)
return
-
EOPNOTSUPP
;
if
(
copy_from_user
(
&
cmd
,
useraddr
,
sizeof
(
cmd
)))
/* struct ethtool_rxnfc was originally defined for
* ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
* members. User-space might still be using that
* definition. */
if
(
cmd
==
ETHTOOL_SRXFH
)
info_size
=
(
offsetof
(
struct
ethtool_rxnfc
,
data
)
+
sizeof
(
info
.
data
));
if
(
copy_from_user
(
&
info
,
useraddr
,
info_size
))
return
-
EFAULT
;
return
dev
->
ethtool_ops
->
set_rxnfc
(
dev
,
&
cmd
);
return
dev
->
ethtool_ops
->
set_rxnfc
(
dev
,
&
info
);
}
static
noinline_for_stack
int
ethtool_get_rxnfc
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
u32
cmd
,
void
__user
*
useraddr
)
{
struct
ethtool_rxnfc
info
;
size_t
info_size
=
sizeof
(
info
);
const
struct
ethtool_ops
*
ops
=
dev
->
ethtool_ops
;
int
ret
;
void
*
rule_buf
=
NULL
;
...
...
@@ -324,13 +334,22 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
if
(
!
ops
->
get_rxnfc
)
return
-
EOPNOTSUPP
;
if
(
copy_from_user
(
&
info
,
useraddr
,
sizeof
(
info
)))
/* struct ethtool_rxnfc was originally defined for
* ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
* members. User-space might still be using that
* definition. */
if
(
cmd
==
ETHTOOL_GRXFH
)
info_size
=
(
offsetof
(
struct
ethtool_rxnfc
,
data
)
+
sizeof
(
info
.
data
));
if
(
copy_from_user
(
&
info
,
useraddr
,
info_size
))
return
-
EFAULT
;
if
(
info
.
cmd
==
ETHTOOL_GRXCLSRLALL
)
{
if
(
info
.
rule_cnt
>
0
)
{
rule_buf
=
kmalloc
(
info
.
rule_cnt
*
sizeof
(
u32
),
GFP_USER
);
if
(
info
.
rule_cnt
<=
KMALLOC_MAX_SIZE
/
sizeof
(
u32
))
rule_buf
=
kmalloc
(
info
.
rule_cnt
*
sizeof
(
u32
),
GFP_USER
);
if
(
!
rule_buf
)
return
-
ENOMEM
;
}
...
...
@@ -341,7 +360,7 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
goto
err_out
;
ret
=
-
EFAULT
;
if
(
copy_to_user
(
useraddr
,
&
info
,
sizeof
(
info
)
))
if
(
copy_to_user
(
useraddr
,
&
info
,
info_size
))
goto
err_out
;
if
(
rule_buf
)
{
...
...
@@ -1572,12 +1591,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
case
ETHTOOL_GRXCLSRLCNT
:
case
ETHTOOL_GRXCLSRULE
:
case
ETHTOOL_GRXCLSRLALL
:
rc
=
ethtool_get_rxnfc
(
dev
,
useraddr
);
rc
=
ethtool_get_rxnfc
(
dev
,
ethcmd
,
useraddr
);
break
;
case
ETHTOOL_SRXFH
:
case
ETHTOOL_SRXCLSRLDEL
:
case
ETHTOOL_SRXCLSRLINS
:
rc
=
ethtool_set_rxnfc
(
dev
,
useraddr
);
rc
=
ethtool_set_rxnfc
(
dev
,
ethcmd
,
useraddr
);
break
;
case
ETHTOOL_GGRO
:
rc
=
ethtool_get_gro
(
dev
,
useraddr
);
...
...
net/ipv4/xfrm4_policy.c
浏览文件 @
597e608a
...
...
@@ -108,6 +108,8 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
u8
*
xprth
=
skb_network_header
(
skb
)
+
iph
->
ihl
*
4
;
memset
(
fl
,
0
,
sizeof
(
struct
flowi
));
fl
->
mark
=
skb
->
mark
;
if
(
!
(
iph
->
frag_off
&
htons
(
IP_MF
|
IP_OFFSET
)))
{
switch
(
iph
->
protocol
)
{
case
IPPROTO_UDP
:
...
...
net/ipv6/ndisc.c
浏览文件 @
597e608a
...
...
@@ -586,6 +586,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
src_addr
=
solicited_addr
;
if
(
ifp
->
flags
&
IFA_F_OPTIMISTIC
)
override
=
0
;
inc_opt
|=
ifp
->
idev
->
cnf
.
force_tllao
;
in6_ifa_put
(
ifp
);
}
else
{
if
(
ipv6_dev_get_saddr
(
dev_net
(
dev
),
dev
,
daddr
,
...
...
@@ -599,7 +600,6 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
icmp6h
.
icmp6_solicited
=
solicited
;
icmp6h
.
icmp6_override
=
override
;
inc_opt
|=
ifp
->
idev
->
cnf
.
force_tllao
;
__ndisc_send
(
dev
,
neigh
,
daddr
,
src_addr
,
&
icmp6h
,
solicited_addr
,
inc_opt
?
ND_OPT_TARGET_LL_ADDR
:
0
);
...
...
net/ipv6/netfilter/ip6t_REJECT.c
浏览文件 @
597e608a
...
...
@@ -97,9 +97,11 @@ static void send_reset(struct net *net, struct sk_buff *oldskb)
fl
.
fl_ip_dport
=
otcph
.
source
;
security_skb_classify_flow
(
oldskb
,
&
fl
);
dst
=
ip6_route_output
(
net
,
NULL
,
&
fl
);
if
(
dst
==
NULL
)
if
(
dst
==
NULL
||
dst
->
error
)
{
dst_release
(
dst
);
return
;
if
(
dst
->
error
||
xfrm_lookup
(
net
,
&
dst
,
&
fl
,
NULL
,
0
))
}
if
(
xfrm_lookup
(
net
,
&
dst
,
&
fl
,
NULL
,
0
))
return
;
hh_len
=
(
dst
->
dev
->
hard_header_len
+
15
)
&~
15
;
...
...
net/ipv6/xfrm6_policy.c
浏览文件 @
597e608a
...
...
@@ -124,6 +124,8 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
u8
nexthdr
=
nh
[
IP6CB
(
skb
)
->
nhoff
];
memset
(
fl
,
0
,
sizeof
(
struct
flowi
));
fl
->
mark
=
skb
->
mark
;
ipv6_addr_copy
(
&
fl
->
fl6_dst
,
reverse
?
&
hdr
->
saddr
:
&
hdr
->
daddr
);
ipv6_addr_copy
(
&
fl
->
fl6_src
,
reverse
?
&
hdr
->
daddr
:
&
hdr
->
saddr
);
...
...
net/xfrm/xfrm_policy.c
浏览文件 @
597e608a
...
...
@@ -2300,7 +2300,8 @@ int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first,
return
0
;
if
(
xdst
->
xfrm_genid
!=
dst
->
xfrm
->
genid
)
return
0
;
if
(
xdst
->
policy_genid
!=
atomic_read
(
&
xdst
->
pols
[
0
]
->
genid
))
if
(
xdst
->
num_pols
>
0
&&
xdst
->
policy_genid
!=
atomic_read
(
&
xdst
->
pols
[
0
]
->
genid
))
return
0
;
if
(
strict
&&
fl
&&
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录