Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
bd4a6974
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看板
提交
bd4a6974
编写于
2月 04, 2011
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
上级
2b7bcebf
1e6d93e4
变更
36
隐藏空白更改
内联
并排
Showing
36 changed file
with
352 addition
and
160 deletion
+352
-160
Documentation/networking/ip-sysctl.txt
Documentation/networking/ip-sysctl.txt
+1
-1
MAINTAINERS
MAINTAINERS
+4
-5
drivers/isdn/icn/icn.c
drivers/isdn/icn/icn.c
+2
-1
drivers/net/atl1c/atl1c_main.c
drivers/net/atl1c/atl1c_main.c
+1
-0
drivers/net/benet/be_main.c
drivers/net/benet/be_main.c
+0
-4
drivers/net/bnx2x/bnx2x_main.c
drivers/net/bnx2x/bnx2x_main.c
+2
-7
drivers/net/can/at91_can.c
drivers/net/can/at91_can.c
+1
-1
drivers/net/can/janz-ican3.c
drivers/net/can/janz-ican3.c
+1
-1
drivers/net/can/softing/Kconfig
drivers/net/can/softing/Kconfig
+1
-1
drivers/net/depca.c
drivers/net/depca.c
+3
-3
drivers/net/enc28j60.c
drivers/net/enc28j60.c
+1
-1
drivers/net/niu.c
drivers/net/niu.c
+45
-16
drivers/net/pcmcia/axnet_cs.c
drivers/net/pcmcia/axnet_cs.c
+2
-4
drivers/net/r8169.c
drivers/net/r8169.c
+32
-9
drivers/net/vxge/vxge-config.c
drivers/net/vxge/vxge-config.c
+1
-1
drivers/s390/net/netiucv.c
drivers/s390/net/netiucv.c
+1
-1
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_core_main.c
+76
-73
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l2_main.c
+2
-2
drivers/s390/net/smsgiucv.c
drivers/s390/net/smsgiucv.c
+1
-1
drivers/vhost/net.c
drivers/vhost/net.c
+5
-4
drivers/vhost/vhost.h
drivers/vhost/vhost.h
+3
-3
include/linux/mroute6.h
include/linux/mroute6.h
+1
-0
include/net/genetlink.h
include/net/genetlink.h
+2
-1
include/net/netfilter/nf_conntrack_ecache.h
include/net/netfilter/nf_conntrack_ecache.h
+0
-3
net/bridge/br_fdb.c
net/bridge/br_fdb.c
+2
-2
net/core/dev.c
net/core/dev.c
+3
-1
net/ipv4/ipmr.c
net/ipv4/ipmr.c
+31
-1
net/ipv4/netfilter/arpt_mangle.c
net/ipv4/netfilter/arpt_mangle.c
+3
-3
net/ipv4/route.c
net/ipv4/route.c
+6
-0
net/ipv6/ip6mr.c
net/ipv6/ip6mr.c
+75
-0
net/ipv6/raw.c
net/ipv6/raw.c
+19
-0
net/ipv6/route.c
net/ipv6/route.c
+6
-0
net/ipv6/sysctl_net_ipv6.c
net/ipv6/sysctl_net_ipv6.c
+8
-1
net/netfilter/nf_conntrack_ecache.c
net/netfilter/nf_conntrack_ecache.c
+3
-0
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_netlink.c
+1
-0
net/netfilter/xt_iprange.c
net/netfilter/xt_iprange.c
+7
-9
未找到文件。
Documentation/networking/ip-sysctl.txt
浏览文件 @
bd4a6974
...
...
@@ -187,7 +187,7 @@ tcp_cookie_size - INTEGER
tcp_dsack - BOOLEAN
Allows TCP to send "duplicate" SACKs.
tcp_ecn -
BOOLEAN
tcp_ecn -
INTEGER
Enable Explicit Congestion Notification (ECN) in TCP. ECN is only
used when both ends of the TCP flow support it. It is useful to
avoid losses due to congestion (when the bottleneck router supports
...
...
MAINTAINERS
浏览文件 @
bd4a6974
...
...
@@ -5544,12 +5544,11 @@ S: Supported
F: drivers/scsi/be2iscsi/
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
M: Sathya Perla <sathyap@serverengines.com>
M: Subbu Seetharaman <subbus@serverengines.com>
M: Sarveshwar Bandi <sarveshwarb@serverengines.com>
M: Ajit Khaparde <ajitk@serverengines.com>
M: Sathya Perla <sathya.perla@emulex.com>
M: Subbu Seetharaman <subbu.seetharaman@emulex.com>
M: Ajit Khaparde <ajit.khaparde@emulex.com>
L: netdev@vger.kernel.org
W: http://www.
serverengines
.com
W: http://www.
emulex
.com
S: Supported
F: drivers/net/benet/
...
...
drivers/isdn/icn/icn.c
浏览文件 @
bd4a6974
...
...
@@ -1627,7 +1627,7 @@ __setup("icn=", icn_setup);
static
int
__init
icn_init
(
void
)
{
char
*
p
;
char
rev
[
2
0
];
char
rev
[
2
1
];
memset
(
&
dev
,
0
,
sizeof
(
icn_dev
));
dev
.
memaddr
=
(
membase
&
0x0ffc000
);
...
...
@@ -1638,6 +1638,7 @@ static int __init icn_init(void)
if
((
p
=
strchr
(
revision
,
':'
)))
{
strncpy
(
rev
,
p
+
1
,
20
);
rev
[
20
]
=
'\0'
;
p
=
strchr
(
rev
,
'$'
);
if
(
p
)
*
p
=
0
;
...
...
drivers/net/atl1c/atl1c_main.c
浏览文件 @
bd4a6974
...
...
@@ -48,6 +48,7 @@ static DEFINE_PCI_DEVICE_TABLE(atl1c_pci_tbl) = {
{
PCI_DEVICE
(
PCI_VENDOR_ID_ATTANSIC
,
PCI_DEVICE_ID_ATHEROS_L2C_B
)},
{
PCI_DEVICE
(
PCI_VENDOR_ID_ATTANSIC
,
PCI_DEVICE_ID_ATHEROS_L2C_B2
)},
{
PCI_DEVICE
(
PCI_VENDOR_ID_ATTANSIC
,
PCI_DEVICE_ID_ATHEROS_L1D
)},
{
PCI_DEVICE
(
PCI_VENDOR_ID_ATTANSIC
,
PCI_DEVICE_ID_ATHEROS_L1D_2_0
)},
/* required last entry */
{
0
}
};
...
...
drivers/net/benet/be_main.c
浏览文件 @
bd4a6974
...
...
@@ -313,11 +313,9 @@ void be_link_status_update(struct be_adapter *adapter, bool link_up)
if
(
adapter
->
link_up
!=
link_up
)
{
adapter
->
link_speed
=
-
1
;
if
(
link_up
)
{
netif_start_queue
(
netdev
);
netif_carrier_on
(
netdev
);
printk
(
KERN_INFO
"%s: Link up
\n
"
,
netdev
->
name
);
}
else
{
netif_stop_queue
(
netdev
);
netif_carrier_off
(
netdev
);
printk
(
KERN_INFO
"%s: Link down
\n
"
,
netdev
->
name
);
}
...
...
@@ -2628,8 +2626,6 @@ static void be_netdev_init(struct net_device *netdev)
netif_napi_add
(
netdev
,
&
adapter
->
tx_eq
.
napi
,
be_poll_tx_mcc
,
BE_NAPI_WEIGHT
);
netif_stop_queue
(
netdev
);
}
static
void
be_unmap_pci_bars
(
struct
be_adapter
*
adapter
)
...
...
drivers/net/bnx2x/bnx2x_main.c
浏览文件 @
bd4a6974
...
...
@@ -2301,15 +2301,10 @@ static void bnx2x_rxq_set_mac_filters(struct bnx2x *bp, u16 cl_id, u32 filters)
/* accept matched ucast */
drop_all_ucast
=
0
;
}
if
(
filters
&
BNX2X_ACCEPT_MULTICAST
)
{
if
(
filters
&
BNX2X_ACCEPT_MULTICAST
)
/* accept matched mcast */
drop_all_mcast
=
0
;
if
(
IS_MF_SI
(
bp
))
/* since mcast addresses won't arrive with ovlan,
* fw needs to accept all of them in
* switch-independent mode */
accp_all_mcast
=
1
;
}
if
(
filters
&
BNX2X_ACCEPT_ALL_UNICAST
)
{
/* accept all mcast */
drop_all_ucast
=
0
;
...
...
drivers/net/can/at91_can.c
浏览文件 @
bd4a6974
...
...
@@ -1109,7 +1109,7 @@ static ssize_t at91_sysfs_set_mb0_id(struct device *dev,
return
ret
;
}
static
DEVICE_ATTR
(
mb0_id
,
S_IWU
GO
|
S_IRUGO
,
static
DEVICE_ATTR
(
mb0_id
,
S_IWU
SR
|
S_IRUGO
,
at91_sysfs_show_mb0_id
,
at91_sysfs_set_mb0_id
);
static
struct
attribute
*
at91_sysfs_attrs
[]
=
{
...
...
drivers/net/can/janz-ican3.c
浏览文件 @
bd4a6974
...
...
@@ -1618,7 +1618,7 @@ static ssize_t ican3_sysfs_set_term(struct device *dev,
return
count
;
}
static
DEVICE_ATTR
(
termination
,
S_IWU
GO
|
S_IRUGO
,
ican3_sysfs_show_term
,
static
DEVICE_ATTR
(
termination
,
S_IWU
SR
|
S_IRUGO
,
ican3_sysfs_show_term
,
ican3_sysfs_set_term
);
static
struct
attribute
*
ican3_sysfs_attrs
[]
=
{
...
...
drivers/net/can/softing/Kconfig
浏览文件 @
bd4a6974
config CAN_SOFTING
tristate "Softing Gmbh CAN generic support"
depends on CAN_DEV
depends on CAN_DEV
&& HAS_IOMEM
---help---
Support for CAN cards from Softing Gmbh & some cards
from Vector Gmbh.
...
...
drivers/net/depca.c
浏览文件 @
bd4a6974
...
...
@@ -1094,7 +1094,7 @@ static int depca_rx(struct net_device *dev)
}
}
/* Change buffer ownership for this last frame, back to the adapter */
for
(;
lp
->
rx_old
!=
entry
;
lp
->
rx_old
=
(
++
lp
->
rx_old
)
&
lp
->
rxRingMask
)
{
for
(;
lp
->
rx_old
!=
entry
;
lp
->
rx_old
=
(
lp
->
rx_old
+
1
)
&
lp
->
rxRingMask
)
{
writel
(
readl
(
&
lp
->
rx_ring
[
lp
->
rx_old
].
base
)
|
R_OWN
,
&
lp
->
rx_ring
[
lp
->
rx_old
].
base
);
}
writel
(
readl
(
&
lp
->
rx_ring
[
entry
].
base
)
|
R_OWN
,
&
lp
->
rx_ring
[
entry
].
base
);
...
...
@@ -1103,7 +1103,7 @@ static int depca_rx(struct net_device *dev)
/*
** Update entry information
*/
lp
->
rx_new
=
(
++
lp
->
rx_new
)
&
lp
->
rxRingMask
;
lp
->
rx_new
=
(
lp
->
rx_new
+
1
)
&
lp
->
rxRingMask
;
}
return
0
;
...
...
@@ -1148,7 +1148,7 @@ static int depca_tx(struct net_device *dev)
}
/* Update all the pointers */
lp
->
tx_old
=
(
++
lp
->
tx_old
)
&
lp
->
txRingMask
;
lp
->
tx_old
=
(
lp
->
tx_old
+
1
)
&
lp
->
txRingMask
;
}
return
0
;
...
...
drivers/net/enc28j60.c
浏览文件 @
bd4a6974
...
...
@@ -812,7 +812,7 @@ static void enc28j60_read_tsv(struct enc28j60_net *priv, u8 tsv[TSV_SIZE])
if
(
netif_msg_hw
(
priv
))
printk
(
KERN_DEBUG
DRV_NAME
": reading TSV at addr:0x%04x
\n
"
,
endptr
+
1
);
enc28j60_mem_read
(
priv
,
endptr
+
1
,
sizeof
(
tsv
)
,
tsv
);
enc28j60_mem_read
(
priv
,
endptr
+
1
,
TSV_SIZE
,
tsv
);
}
static
void
enc28j60_dump_tsv
(
struct
enc28j60_net
*
priv
,
const
char
*
msg
,
...
...
drivers/net/niu.c
浏览文件 @
bd4a6974
...
...
@@ -4489,6 +4489,9 @@ static int niu_alloc_channels(struct niu *np)
{
struct
niu_parent
*
parent
=
np
->
parent
;
int
first_rx_channel
,
first_tx_channel
;
int
num_rx_rings
,
num_tx_rings
;
struct
rx_ring_info
*
rx_rings
;
struct
tx_ring_info
*
tx_rings
;
int
i
,
port
,
err
;
port
=
np
->
port
;
...
...
@@ -4498,18 +4501,21 @@ static int niu_alloc_channels(struct niu *np)
first_tx_channel
+=
parent
->
txchan_per_port
[
i
];
}
n
p
->
n
um_rx_rings
=
parent
->
rxchan_per_port
[
port
];
n
p
->
n
um_tx_rings
=
parent
->
txchan_per_port
[
port
];
num_rx_rings
=
parent
->
rxchan_per_port
[
port
];
num_tx_rings
=
parent
->
txchan_per_port
[
port
];
netif_set_real_num_rx_queues
(
np
->
dev
,
np
->
num_rx_rings
);
netif_set_real_num_tx_queues
(
np
->
dev
,
np
->
num_tx_rings
);
np
->
rx_rings
=
kcalloc
(
np
->
num_rx_rings
,
sizeof
(
struct
rx_ring_info
),
GFP_KERNEL
);
rx_rings
=
kcalloc
(
num_rx_rings
,
sizeof
(
struct
rx_ring_info
),
GFP_KERNEL
);
err
=
-
ENOMEM
;
if
(
!
np
->
rx_rings
)
if
(
!
rx_rings
)
goto
out_err
;
np
->
num_rx_rings
=
num_rx_rings
;
smp_wmb
();
np
->
rx_rings
=
rx_rings
;
netif_set_real_num_rx_queues
(
np
->
dev
,
num_rx_rings
);
for
(
i
=
0
;
i
<
np
->
num_rx_rings
;
i
++
)
{
struct
rx_ring_info
*
rp
=
&
np
->
rx_rings
[
i
];
...
...
@@ -4538,12 +4544,18 @@ static int niu_alloc_channels(struct niu *np)
return
err
;
}
np
->
tx_rings
=
kcalloc
(
np
->
num_tx_rings
,
sizeof
(
struct
tx_ring_info
),
GFP_KERNEL
);
tx_rings
=
kcalloc
(
num_tx_rings
,
sizeof
(
struct
tx_ring_info
),
GFP_KERNEL
);
err
=
-
ENOMEM
;
if
(
!
np
->
tx_rings
)
if
(
!
tx_rings
)
goto
out_err
;
np
->
num_tx_rings
=
num_tx_rings
;
smp_wmb
();
np
->
tx_rings
=
tx_rings
;
netif_set_real_num_tx_queues
(
np
->
dev
,
num_tx_rings
);
for
(
i
=
0
;
i
<
np
->
num_tx_rings
;
i
++
)
{
struct
tx_ring_info
*
rp
=
&
np
->
tx_rings
[
i
];
...
...
@@ -6246,11 +6258,17 @@ static void niu_sync_mac_stats(struct niu *np)
static
void
niu_get_rx_stats
(
struct
niu
*
np
)
{
unsigned
long
pkts
,
dropped
,
errors
,
bytes
;
struct
rx_ring_info
*
rx_rings
;
int
i
;
pkts
=
dropped
=
errors
=
bytes
=
0
;
rx_rings
=
ACCESS_ONCE
(
np
->
rx_rings
);
if
(
!
rx_rings
)
goto
no_rings
;
for
(
i
=
0
;
i
<
np
->
num_rx_rings
;
i
++
)
{
struct
rx_ring_info
*
rp
=
&
np
->
rx_rings
[
i
];
struct
rx_ring_info
*
rp
=
&
rx_rings
[
i
];
niu_sync_rx_discard_stats
(
np
,
rp
,
0
);
...
...
@@ -6259,6 +6277,8 @@ static void niu_get_rx_stats(struct niu *np)
dropped
+=
rp
->
rx_dropped
;
errors
+=
rp
->
rx_errors
;
}
no_rings:
np
->
dev
->
stats
.
rx_packets
=
pkts
;
np
->
dev
->
stats
.
rx_bytes
=
bytes
;
np
->
dev
->
stats
.
rx_dropped
=
dropped
;
...
...
@@ -6268,16 +6288,24 @@ static void niu_get_rx_stats(struct niu *np)
static
void
niu_get_tx_stats
(
struct
niu
*
np
)
{
unsigned
long
pkts
,
errors
,
bytes
;
struct
tx_ring_info
*
tx_rings
;
int
i
;
pkts
=
errors
=
bytes
=
0
;
tx_rings
=
ACCESS_ONCE
(
np
->
tx_rings
);
if
(
!
tx_rings
)
goto
no_rings
;
for
(
i
=
0
;
i
<
np
->
num_tx_rings
;
i
++
)
{
struct
tx_ring_info
*
rp
=
&
np
->
tx_rings
[
i
];
struct
tx_ring_info
*
rp
=
&
tx_rings
[
i
];
pkts
+=
rp
->
tx_packets
;
bytes
+=
rp
->
tx_bytes
;
errors
+=
rp
->
tx_errors
;
}
no_rings:
np
->
dev
->
stats
.
tx_packets
=
pkts
;
np
->
dev
->
stats
.
tx_bytes
=
bytes
;
np
->
dev
->
stats
.
tx_errors
=
errors
;
...
...
@@ -6287,9 +6315,10 @@ static struct net_device_stats *niu_get_stats(struct net_device *dev)
{
struct
niu
*
np
=
netdev_priv
(
dev
);
niu_get_rx_stats
(
np
);
niu_get_tx_stats
(
np
);
if
(
netif_running
(
dev
))
{
niu_get_rx_stats
(
np
);
niu_get_tx_stats
(
np
);
}
return
&
dev
->
stats
;
}
...
...
drivers/net/pcmcia/axnet_cs.c
浏览文件 @
bd4a6974
...
...
@@ -1488,12 +1488,10 @@ static void ei_rx_overrun(struct net_device *dev)
/*
* Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
* Early datasheets said to poll the reset bit, but now they say that
* it "is not a reliable indicator and subsequently should be ignored."
* We wait at least 10ms.
* We wait at least 2ms.
*/
mdelay
(
10
);
mdelay
(
2
);
/*
* Reset RBCR[01] back to zero as per magic incantation.
...
...
drivers/net/r8169.c
浏览文件 @
bd4a6974
...
...
@@ -973,7 +973,8 @@ static void __rtl8169_check_link_status(struct net_device *dev,
if
(
pm
)
pm_request_resume
(
&
tp
->
pci_dev
->
dev
);
netif_carrier_on
(
dev
);
netif_info
(
tp
,
ifup
,
dev
,
"link up
\n
"
);
if
(
net_ratelimit
())
netif_info
(
tp
,
ifup
,
dev
,
"link up
\n
"
);
}
else
{
netif_carrier_off
(
dev
);
netif_info
(
tp
,
ifdown
,
dev
,
"link down
\n
"
);
...
...
@@ -3757,7 +3758,8 @@ static void rtl_hw_start_8168(struct net_device *dev)
RTL_W16
(
IntrMitigate
,
0x5151
);
/* Work around for RxFIFO overflow. */
if
(
tp
->
mac_version
==
RTL_GIGA_MAC_VER_11
)
{
if
(
tp
->
mac_version
==
RTL_GIGA_MAC_VER_11
||
tp
->
mac_version
==
RTL_GIGA_MAC_VER_22
)
{
tp
->
intr_event
|=
RxFIFOOver
|
PCSTimeout
;
tp
->
intr_event
&=
~
RxOverflow
;
}
...
...
@@ -4639,12 +4641,33 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
break
;
}
/* Work around for rx fifo overflow */
if
(
unlikely
(
status
&
RxFIFOOver
)
&&
(
tp
->
mac_version
==
RTL_GIGA_MAC_VER_11
))
{
netif_stop_queue
(
dev
);
rtl8169_tx_timeout
(
dev
);
break
;
if
(
unlikely
(
status
&
RxFIFOOver
))
{
switch
(
tp
->
mac_version
)
{
/* Work around for rx fifo overflow */
case
RTL_GIGA_MAC_VER_11
:
case
RTL_GIGA_MAC_VER_22
:
case
RTL_GIGA_MAC_VER_26
:
netif_stop_queue
(
dev
);
rtl8169_tx_timeout
(
dev
);
goto
done
;
/* Testers needed. */
case
RTL_GIGA_MAC_VER_17
:
case
RTL_GIGA_MAC_VER_19
:
case
RTL_GIGA_MAC_VER_20
:
case
RTL_GIGA_MAC_VER_21
:
case
RTL_GIGA_MAC_VER_23
:
case
RTL_GIGA_MAC_VER_24
:
case
RTL_GIGA_MAC_VER_27
:
case
RTL_GIGA_MAC_VER_28
:
/* Experimental science. Pktgen proof. */
case
RTL_GIGA_MAC_VER_12
:
case
RTL_GIGA_MAC_VER_25
:
if
(
status
==
RxFIFOOver
)
goto
done
;
break
;
default:
break
;
}
}
if
(
unlikely
(
status
&
SYSErr
))
{
...
...
@@ -4680,7 +4703,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
(
status
&
RxFIFOOver
)
?
(
status
|
RxOverflow
)
:
status
);
status
=
RTL_R16
(
IntrStatus
);
}
done:
return
IRQ_RETVAL
(
handled
);
}
...
...
drivers/net/vxge/vxge-config.c
浏览文件 @
bd4a6974
...
...
@@ -3694,7 +3694,7 @@ __vxge_hw_vpath_rts_table_get(struct __vxge_hw_vpath_handle *vp,
if
(
status
!=
VXGE_HW_OK
)
goto
exit
;
if
((
rts_table
!=
VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA
)
||
if
((
rts_table
!=
VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA
)
&&
(
rts_table
!=
VXGE_HW_RTS_ACS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT
))
*
data1
=
0
;
...
...
drivers/s390/net/netiucv.c
浏览文件 @
bd4a6974
...
...
@@ -565,7 +565,7 @@ static int netiucv_callback_connreq(struct iucv_path *path,
struct
iucv_event
ev
;
int
rc
;
if
(
memcmp
(
iucvMagic
,
ipuser
,
sizeof
(
ipuser
)
))
if
(
memcmp
(
iucvMagic
,
ipuser
,
16
))
/* ipuser must match iucvMagic. */
return
-
EINVAL
;
rc
=
-
EINVAL
;
...
...
drivers/s390/net/qeth_core_main.c
浏览文件 @
bd4a6974
...
...
@@ -988,16 +988,30 @@ static void qeth_get_channel_path_desc(struct qeth_card *card)
chp_dsc
=
(
struct
channelPath_dsc
*
)
ccw_device_get_chp_desc
(
ccwdev
,
0
);
if
(
chp_dsc
!=
NULL
)
{
/* CHPP field bit 6 == 1 -> single queue */
if
((
chp_dsc
->
chpp
&
0x02
)
==
0x02
)
if
((
chp_dsc
->
chpp
&
0x02
)
==
0x02
)
{
if
((
atomic_read
(
&
card
->
qdio
.
state
)
!=
QETH_QDIO_UNINITIALIZED
)
&&
(
card
->
qdio
.
no_out_queues
==
4
))
/* change from 4 to 1 outbound queues */
qeth_free_qdio_buffers
(
card
);
card
->
qdio
.
no_out_queues
=
1
;
if
(
card
->
qdio
.
default_out_queue
!=
0
)
dev_info
(
&
card
->
gdev
->
dev
,
"Priority Queueing not supported
\n
"
);
card
->
qdio
.
default_out_queue
=
0
;
}
else
{
if
((
atomic_read
(
&
card
->
qdio
.
state
)
!=
QETH_QDIO_UNINITIALIZED
)
&&
(
card
->
qdio
.
no_out_queues
==
1
))
{
/* change from 1 to 4 outbound queues */
qeth_free_qdio_buffers
(
card
);
card
->
qdio
.
default_out_queue
=
2
;
}
card
->
qdio
.
no_out_queues
=
4
;
}
card
->
info
.
func_level
=
0x4100
+
chp_dsc
->
desc
;
kfree
(
chp_dsc
);
}
if
(
card
->
qdio
.
no_out_queues
==
1
)
{
card
->
qdio
.
default_out_queue
=
0
;
dev_info
(
&
card
->
gdev
->
dev
,
"Priority Queueing not supported
\n
"
);
}
QETH_DBF_TEXT_
(
SETUP
,
2
,
"nr:%x"
,
card
->
qdio
.
no_out_queues
);
QETH_DBF_TEXT_
(
SETUP
,
2
,
"lvl:%02x"
,
card
->
info
.
func_level
);
return
;
...
...
@@ -1832,33 +1846,6 @@ static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card)
}
}
static
inline
int
qeth_get_max_mtu_for_card
(
int
cardtype
)
{
switch
(
cardtype
)
{
case
QETH_CARD_TYPE_UNKNOWN
:
case
QETH_CARD_TYPE_OSD
:
case
QETH_CARD_TYPE_OSN
:
case
QETH_CARD_TYPE_OSM
:
case
QETH_CARD_TYPE_OSX
:
return
61440
;
case
QETH_CARD_TYPE_IQD
:
return
57344
;
default:
return
1500
;
}
}
static
inline
int
qeth_get_mtu_out_of_mpc
(
int
cardtype
)
{
switch
(
cardtype
)
{
case
QETH_CARD_TYPE_IQD
:
return
1
;
default:
return
0
;
}
}
static
inline
int
qeth_get_mtu_outof_framesize
(
int
framesize
)
{
switch
(
framesize
)
{
...
...
@@ -1881,10 +1868,9 @@ static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
case
QETH_CARD_TYPE_OSD
:
case
QETH_CARD_TYPE_OSM
:
case
QETH_CARD_TYPE_OSX
:
return
((
mtu
>=
576
)
&&
(
mtu
<=
61440
));
case
QETH_CARD_TYPE_IQD
:
return
((
mtu
>=
576
)
&&
(
mtu
<=
card
->
info
.
max_mtu
+
4096
-
32
));
(
mtu
<=
card
->
info
.
max_mtu
));
case
QETH_CARD_TYPE_OSN
:
case
QETH_CARD_TYPE_UNKNOWN
:
default:
...
...
@@ -1907,7 +1893,7 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
memcpy
(
&
card
->
token
.
ulp_filter_r
,
QETH_ULP_ENABLE_RESP_FILTER_TOKEN
(
iob
->
data
),
QETH_MPC_TOKEN_LENGTH
);
if
(
qeth_get_mtu_out_of_mpc
(
card
->
info
.
type
)
)
{
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_IQD
)
{
memcpy
(
&
framesize
,
QETH_ULP_ENABLE_RESP_MAX_MTU
(
iob
->
data
),
2
);
mtu
=
qeth_get_mtu_outof_framesize
(
framesize
);
if
(
!
mtu
)
{
...
...
@@ -1915,12 +1901,21 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
QETH_DBF_TEXT_
(
SETUP
,
2
,
" rc%d"
,
iob
->
rc
);
return
0
;
}
card
->
info
.
max_mtu
=
mtu
;
if
(
card
->
info
.
initial_mtu
&&
(
card
->
info
.
initial_mtu
!=
mtu
))
{
/* frame size has changed */
if
(
card
->
dev
&&
((
card
->
dev
->
mtu
==
card
->
info
.
initial_mtu
)
||
(
card
->
dev
->
mtu
>
mtu
)))
card
->
dev
->
mtu
=
mtu
;
qeth_free_qdio_buffers
(
card
);
}
card
->
info
.
initial_mtu
=
mtu
;
card
->
info
.
max_mtu
=
mtu
;
card
->
qdio
.
in_buf_size
=
mtu
+
2
*
PAGE_SIZE
;
}
else
{
card
->
info
.
initial_mtu
=
qeth_get_initial_mtu_for_card
(
card
);
card
->
info
.
max_mtu
=
qeth_get_max_mtu_for_card
(
card
->
info
.
type
);
card
->
info
.
max_mtu
=
*
(
__u16
*
)
QETH_ULP_ENABLE_RESP_MAX_MTU
(
iob
->
data
);
card
->
qdio
.
in_buf_size
=
QETH_IN_BUF_SIZE_DEFAULT
;
}
...
...
@@ -3775,6 +3770,47 @@ static inline int qeth_get_qdio_q_format(struct qeth_card *card)
}
}
static
void
qeth_determine_capabilities
(
struct
qeth_card
*
card
)
{
int
rc
;
int
length
;
char
*
prcd
;
struct
ccw_device
*
ddev
;
int
ddev_offline
=
0
;
QETH_DBF_TEXT
(
SETUP
,
2
,
"detcapab"
);
ddev
=
CARD_DDEV
(
card
);
if
(
!
ddev
->
online
)
{
ddev_offline
=
1
;
rc
=
ccw_device_set_online
(
ddev
);
if
(
rc
)
{
QETH_DBF_TEXT_
(
SETUP
,
2
,
"3err%d"
,
rc
);
goto
out
;
}
}
rc
=
qeth_read_conf_data
(
card
,
(
void
**
)
&
prcd
,
&
length
);
if
(
rc
)
{
QETH_DBF_MESSAGE
(
2
,
"%s qeth_read_conf_data returned %i
\n
"
,
dev_name
(
&
card
->
gdev
->
dev
),
rc
);
QETH_DBF_TEXT_
(
SETUP
,
2
,
"5err%d"
,
rc
);
goto
out_offline
;
}
qeth_configure_unitaddr
(
card
,
prcd
);
qeth_configure_blkt_default
(
card
,
prcd
);
kfree
(
prcd
);
rc
=
qdio_get_ssqd_desc
(
ddev
,
&
card
->
ssqd
);
if
(
rc
)
QETH_DBF_TEXT_
(
SETUP
,
2
,
"6err%d"
,
rc
);
out_offline:
if
(
ddev_offline
==
1
)
ccw_device_set_offline
(
ddev
);
out:
return
;
}
static
int
qeth_qdio_establish
(
struct
qeth_card
*
card
)
{
struct
qdio_initialize
init_data
;
...
...
@@ -3905,6 +3941,7 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
QETH_DBF_TEXT
(
SETUP
,
2
,
"hrdsetup"
);
atomic_set
(
&
card
->
force_alloc_skb
,
0
);
qeth_get_channel_path_desc
(
card
);
retry:
if
(
retries
)
QETH_DBF_MESSAGE
(
2
,
"%s Retrying to do IDX activates.
\n
"
,
...
...
@@ -3933,6 +3970,7 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
else
goto
retry
;
}
qeth_determine_capabilities
(
card
);
qeth_init_tokens
(
card
);
qeth_init_func_level
(
card
);
rc
=
qeth_idx_activate_channel
(
&
card
->
read
,
qeth_idx_read_cb
);
...
...
@@ -4202,41 +4240,6 @@ void qeth_core_free_discipline(struct qeth_card *card)
card
->
discipline
.
ccwgdriver
=
NULL
;
}
static
void
qeth_determine_capabilities
(
struct
qeth_card
*
card
)
{
int
rc
;
int
length
;
char
*
prcd
;
QETH_DBF_TEXT
(
SETUP
,
2
,
"detcapab"
);
rc
=
ccw_device_set_online
(
CARD_DDEV
(
card
));
if
(
rc
)
{
QETH_DBF_TEXT_
(
SETUP
,
2
,
"3err%d"
,
rc
);
goto
out
;
}
rc
=
qeth_read_conf_data
(
card
,
(
void
**
)
&
prcd
,
&
length
);
if
(
rc
)
{
QETH_DBF_MESSAGE
(
2
,
"%s qeth_read_conf_data returned %i
\n
"
,
dev_name
(
&
card
->
gdev
->
dev
),
rc
);
QETH_DBF_TEXT_
(
SETUP
,
2
,
"5err%d"
,
rc
);
goto
out_offline
;
}
qeth_configure_unitaddr
(
card
,
prcd
);
qeth_configure_blkt_default
(
card
,
prcd
);
kfree
(
prcd
);
rc
=
qdio_get_ssqd_desc
(
CARD_DDEV
(
card
),
&
card
->
ssqd
);
if
(
rc
)
QETH_DBF_TEXT_
(
SETUP
,
2
,
"6err%d"
,
rc
);
out_offline:
ccw_device_set_offline
(
CARD_DDEV
(
card
));
out:
return
;
}
static
int
qeth_core_probe_device
(
struct
ccwgroup_device
*
gdev
)
{
struct
qeth_card
*
card
;
...
...
drivers/s390/net/qeth_l2_main.c
浏览文件 @
bd4a6974
...
...
@@ -573,13 +573,13 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card,
case
IPA_RC_L2_DUP_LAYER3_MAC
:
dev_warn
(
&
card
->
gdev
->
dev
,
"MAC address %pM already exists
\n
"
,
c
ard
->
dev
->
dev_addr
);
c
md
->
data
.
setdelmac
.
mac
);
break
;
case
IPA_RC_L2_MAC_NOT_AUTH_BY_HYP
:
case
IPA_RC_L2_MAC_NOT_AUTH_BY_ADP
:
dev_warn
(
&
card
->
gdev
->
dev
,
"MAC address %pM is not authorized
\n
"
,
c
ard
->
dev
->
dev_addr
);
c
md
->
data
.
setdelmac
.
mac
);
break
;
default:
break
;
...
...
drivers/s390/net/smsgiucv.c
浏览文件 @
bd4a6974
...
...
@@ -60,7 +60,7 @@ static struct iucv_handler smsg_handler = {
static
int
smsg_path_pending
(
struct
iucv_path
*
path
,
u8
ipvmid
[
8
],
u8
ipuser
[
16
])
{
if
(
strncmp
(
ipvmid
,
"*MSG "
,
sizeof
(
ipvmid
)
)
!=
0
)
if
(
strncmp
(
ipvmid
,
"*MSG "
,
8
)
!=
0
)
return
-
EINVAL
;
/* Path pending from *MSG. */
return
iucv_path_accept
(
path
,
&
smsg_handler
,
"SMSGIUCV "
,
NULL
);
...
...
drivers/vhost/net.c
浏览文件 @
bd4a6974
...
...
@@ -128,8 +128,7 @@ static void handle_tx(struct vhost_net *net)
size_t
hdr_size
;
struct
socket
*
sock
;
/* TODO: check that we are running from vhost_worker?
* Not sure it's worth it, it's straight-forward enough. */
/* TODO: check that we are running from vhost_worker? */
sock
=
rcu_dereference_check
(
vq
->
private_data
,
1
);
if
(
!
sock
)
return
;
...
...
@@ -306,7 +305,8 @@ static void handle_rx_big(struct vhost_net *net)
size_t
len
,
total_len
=
0
;
int
err
;
size_t
hdr_size
;
struct
socket
*
sock
=
rcu_dereference
(
vq
->
private_data
);
/* TODO: check that we are running from vhost_worker? */
struct
socket
*
sock
=
rcu_dereference_check
(
vq
->
private_data
,
1
);
if
(
!
sock
||
skb_queue_empty
(
&
sock
->
sk
->
sk_receive_queue
))
return
;
...
...
@@ -415,7 +415,8 @@ static void handle_rx_mergeable(struct vhost_net *net)
int
err
,
headcount
;
size_t
vhost_hlen
,
sock_hlen
;
size_t
vhost_len
,
sock_len
;
struct
socket
*
sock
=
rcu_dereference
(
vq
->
private_data
);
/* TODO: check that we are running from vhost_worker? */
struct
socket
*
sock
=
rcu_dereference_check
(
vq
->
private_data
,
1
);
if
(
!
sock
||
skb_queue_empty
(
&
sock
->
sk
->
sk_receive_queue
))
return
;
...
...
drivers/vhost/vhost.h
浏览文件 @
bd4a6974
...
...
@@ -173,9 +173,9 @@ static inline int vhost_has_feature(struct vhost_dev *dev, int bit)
{
unsigned
acked_features
;
acked_features
=
rcu_dereference_index_check
(
dev
->
acked_features
,
lockdep_is_held
(
&
dev
->
mutex
)
);
/* TODO: check that we are running from vhost_worker or dev mutex is
* held? */
acked_features
=
rcu_dereference_index_check
(
dev
->
acked_features
,
1
);
return
acked_features
&
(
1
<<
bit
);
}
...
...
include/linux/mroute6.h
浏览文件 @
bd4a6974
...
...
@@ -136,6 +136,7 @@ extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int
extern
int
ip6_mroute_getsockopt
(
struct
sock
*
,
int
,
char
__user
*
,
int
__user
*
);
extern
int
ip6_mr_input
(
struct
sk_buff
*
skb
);
extern
int
ip6mr_ioctl
(
struct
sock
*
sk
,
int
cmd
,
void
__user
*
arg
);
extern
int
ip6mr_compat_ioctl
(
struct
sock
*
sk
,
unsigned
int
cmd
,
void
__user
*
arg
);
extern
int
ip6_mr_init
(
void
);
extern
void
ip6_mr_cleanup
(
void
);
#else
...
...
include/net/genetlink.h
浏览文件 @
bd4a6974
...
...
@@ -195,7 +195,8 @@ static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
*/
static
inline
void
genlmsg_cancel
(
struct
sk_buff
*
skb
,
void
*
hdr
)
{
nlmsg_cancel
(
skb
,
hdr
-
GENL_HDRLEN
-
NLMSG_HDRLEN
);
if
(
hdr
)
nlmsg_cancel
(
skb
,
hdr
-
GENL_HDRLEN
-
NLMSG_HDRLEN
);
}
/**
...
...
include/net/netfilter/nf_conntrack_ecache.h
浏览文件 @
bd4a6974
...
...
@@ -85,9 +85,6 @@ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
if
(
e
==
NULL
)
return
;
if
(
!
(
e
->
ctmask
&
(
1
<<
event
)))
return
;
set_bit
(
event
,
&
e
->
cache
);
}
...
...
net/bridge/br_fdb.c
浏览文件 @
bd4a6974
...
...
@@ -328,12 +328,12 @@ static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
fdb
=
kmem_cache_alloc
(
br_fdb_cache
,
GFP_ATOMIC
);
if
(
fdb
)
{
memcpy
(
fdb
->
addr
.
addr
,
addr
,
ETH_ALEN
);
hlist_add_head_rcu
(
&
fdb
->
hlist
,
head
);
fdb
->
dst
=
source
;
fdb
->
is_local
=
is_local
;
fdb
->
is_static
=
is_local
;
fdb
->
ageing_timer
=
jiffies
;
hlist_add_head_rcu
(
&
fdb
->
hlist
,
head
);
}
return
fdb
;
}
...
...
net/core/dev.c
浏览文件 @
bd4a6974
...
...
@@ -2666,7 +2666,8 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
map
=
rcu_dereference
(
rxqueue
->
rps_map
);
if
(
map
)
{
if
(
map
->
len
==
1
)
{
if
(
map
->
len
==
1
&&
!
rcu_dereference_raw
(
rxqueue
->
rps_flow_table
))
{
tcpu
=
map
->
cpus
[
0
];
if
(
cpu_online
(
tcpu
))
cpu
=
tcpu
;
...
...
@@ -3565,6 +3566,7 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
skb_reserve
(
skb
,
NET_IP_ALIGN
-
skb_headroom
(
skb
));
skb
->
vlan_tci
=
0
;
skb
->
dev
=
napi
->
dev
;
skb
->
skb_iif
=
0
;
napi
->
skb
=
skb
;
}
...
...
net/ipv4/ipmr.c
浏览文件 @
bd4a6974
...
...
@@ -1444,9 +1444,19 @@ struct compat_sioc_sg_req {
compat_ulong_t
wrong_if
;
};
struct
compat_sioc_vif_req
{
vifi_t
vifi
;
/* Which iface */
compat_ulong_t
icount
;
compat_ulong_t
ocount
;
compat_ulong_t
ibytes
;
compat_ulong_t
obytes
;
};
int
ipmr_compat_ioctl
(
struct
sock
*
sk
,
unsigned
int
cmd
,
void
__user
*
arg
)
{
struct
sioc_sg_req
sr
;
struct
compat_sioc_sg_req
sr
;
struct
compat_sioc_vif_req
vr
;
struct
vif_device
*
vif
;
struct
mfc_cache
*
c
;
struct
net
*
net
=
sock_net
(
sk
);
struct
mr_table
*
mrt
;
...
...
@@ -1456,6 +1466,26 @@ int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
return
-
ENOENT
;
switch
(
cmd
)
{
case
SIOCGETVIFCNT
:
if
(
copy_from_user
(
&
vr
,
arg
,
sizeof
(
vr
)))
return
-
EFAULT
;
if
(
vr
.
vifi
>=
mrt
->
maxvif
)
return
-
EINVAL
;
read_lock
(
&
mrt_lock
);
vif
=
&
mrt
->
vif_table
[
vr
.
vifi
];
if
(
VIF_EXISTS
(
mrt
,
vr
.
vifi
))
{
vr
.
icount
=
vif
->
pkt_in
;
vr
.
ocount
=
vif
->
pkt_out
;
vr
.
ibytes
=
vif
->
bytes_in
;
vr
.
obytes
=
vif
->
bytes_out
;
read_unlock
(
&
mrt_lock
);
if
(
copy_to_user
(
arg
,
&
vr
,
sizeof
(
vr
)))
return
-
EFAULT
;
return
0
;
}
read_unlock
(
&
mrt_lock
);
return
-
EADDRNOTAVAIL
;
case
SIOCGETSGCNT
:
if
(
copy_from_user
(
&
sr
,
arg
,
sizeof
(
sr
)))
return
-
EFAULT
;
...
...
net/ipv4/netfilter/arpt_mangle.c
浏览文件 @
bd4a6974
...
...
@@ -60,12 +60,12 @@ static int checkentry(const struct xt_tgchk_param *par)
if
(
mangle
->
flags
&
~
ARPT_MANGLE_MASK
||
!
(
mangle
->
flags
&
ARPT_MANGLE_MASK
))
return
false
;
return
-
EINVAL
;
if
(
mangle
->
target
!=
NF_DROP
&&
mangle
->
target
!=
NF_ACCEPT
&&
mangle
->
target
!=
XT_CONTINUE
)
return
false
;
return
true
;
return
-
EINVAL
;
return
0
;
}
static
struct
xt_target
arpt_mangle_reg
__read_mostly
=
{
...
...
net/ipv4/route.c
浏览文件 @
bd4a6974
...
...
@@ -2773,6 +2773,11 @@ static struct dst_entry *ipv4_blackhole_dst_check(struct dst_entry *dst, u32 coo
return
NULL
;
}
static
unsigned
int
ipv4_blackhole_default_mtu
(
const
struct
dst_entry
*
dst
)
{
return
0
;
}
static
void
ipv4_rt_blackhole_update_pmtu
(
struct
dst_entry
*
dst
,
u32
mtu
)
{
}
...
...
@@ -2782,6 +2787,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
.
protocol
=
cpu_to_be16
(
ETH_P_IP
),
.
destroy
=
ipv4_dst_destroy
,
.
check
=
ipv4_blackhole_dst_check
,
.
default_mtu
=
ipv4_blackhole_default_mtu
,
.
update_pmtu
=
ipv4_rt_blackhole_update_pmtu
,
};
...
...
net/ipv6/ip6mr.c
浏览文件 @
bd4a6974
...
...
@@ -34,6 +34,7 @@
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/compat.h>
#include <net/protocol.h>
#include <linux/skbuff.h>
#include <net/sock.h>
...
...
@@ -1804,6 +1805,80 @@ int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
}
}
#ifdef CONFIG_COMPAT
struct
compat_sioc_sg_req6
{
struct
sockaddr_in6
src
;
struct
sockaddr_in6
grp
;
compat_ulong_t
pktcnt
;
compat_ulong_t
bytecnt
;
compat_ulong_t
wrong_if
;
};
struct
compat_sioc_mif_req6
{
mifi_t
mifi
;
compat_ulong_t
icount
;
compat_ulong_t
ocount
;
compat_ulong_t
ibytes
;
compat_ulong_t
obytes
;
};
int
ip6mr_compat_ioctl
(
struct
sock
*
sk
,
unsigned
int
cmd
,
void
__user
*
arg
)
{
struct
compat_sioc_sg_req6
sr
;
struct
compat_sioc_mif_req6
vr
;
struct
mif_device
*
vif
;
struct
mfc6_cache
*
c
;
struct
net
*
net
=
sock_net
(
sk
);
struct
mr6_table
*
mrt
;
mrt
=
ip6mr_get_table
(
net
,
raw6_sk
(
sk
)
->
ip6mr_table
?
:
RT6_TABLE_DFLT
);
if
(
mrt
==
NULL
)
return
-
ENOENT
;
switch
(
cmd
)
{
case
SIOCGETMIFCNT_IN6
:
if
(
copy_from_user
(
&
vr
,
arg
,
sizeof
(
vr
)))
return
-
EFAULT
;
if
(
vr
.
mifi
>=
mrt
->
maxvif
)
return
-
EINVAL
;
read_lock
(
&
mrt_lock
);
vif
=
&
mrt
->
vif6_table
[
vr
.
mifi
];
if
(
MIF_EXISTS
(
mrt
,
vr
.
mifi
))
{
vr
.
icount
=
vif
->
pkt_in
;
vr
.
ocount
=
vif
->
pkt_out
;
vr
.
ibytes
=
vif
->
bytes_in
;
vr
.
obytes
=
vif
->
bytes_out
;
read_unlock
(
&
mrt_lock
);
if
(
copy_to_user
(
arg
,
&
vr
,
sizeof
(
vr
)))
return
-
EFAULT
;
return
0
;
}
read_unlock
(
&
mrt_lock
);
return
-
EADDRNOTAVAIL
;
case
SIOCGETSGCNT_IN6
:
if
(
copy_from_user
(
&
sr
,
arg
,
sizeof
(
sr
)))
return
-
EFAULT
;
read_lock
(
&
mrt_lock
);
c
=
ip6mr_cache_find
(
mrt
,
&
sr
.
src
.
sin6_addr
,
&
sr
.
grp
.
sin6_addr
);
if
(
c
)
{
sr
.
pktcnt
=
c
->
mfc_un
.
res
.
pkt
;
sr
.
bytecnt
=
c
->
mfc_un
.
res
.
bytes
;
sr
.
wrong_if
=
c
->
mfc_un
.
res
.
wrong_if
;
read_unlock
(
&
mrt_lock
);
if
(
copy_to_user
(
arg
,
&
sr
,
sizeof
(
sr
)))
return
-
EFAULT
;
return
0
;
}
read_unlock
(
&
mrt_lock
);
return
-
EADDRNOTAVAIL
;
default:
return
-
ENOIOCTLCMD
;
}
}
#endif
static
inline
int
ip6mr_forward2_finish
(
struct
sk_buff
*
skb
)
{
...
...
net/ipv6/raw.c
浏览文件 @
bd4a6974
...
...
@@ -31,6 +31,7 @@
#include <linux/netfilter.h>
#include <linux/netfilter_ipv6.h>
#include <linux/skbuff.h>
#include <linux/compat.h>
#include <asm/uaccess.h>
#include <asm/ioctls.h>
...
...
@@ -1157,6 +1158,23 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
}
}
#ifdef CONFIG_COMPAT
static
int
compat_rawv6_ioctl
(
struct
sock
*
sk
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
switch
(
cmd
)
{
case
SIOCOUTQ
:
case
SIOCINQ
:
return
-
ENOIOCTLCMD
;
default:
#ifdef CONFIG_IPV6_MROUTE
return
ip6mr_compat_ioctl
(
sk
,
cmd
,
compat_ptr
(
arg
));
#else
return
-
ENOIOCTLCMD
;
#endif
}
}
#endif
static
void
rawv6_close
(
struct
sock
*
sk
,
long
timeout
)
{
if
(
inet_sk
(
sk
)
->
inet_num
==
IPPROTO_RAW
)
...
...
@@ -1215,6 +1233,7 @@ struct proto rawv6_prot = {
#ifdef CONFIG_COMPAT
.
compat_setsockopt
=
compat_rawv6_setsockopt
,
.
compat_getsockopt
=
compat_rawv6_getsockopt
,
.
compat_ioctl
=
compat_rawv6_ioctl
,
#endif
};
...
...
net/ipv6/route.c
浏览文件 @
bd4a6974
...
...
@@ -144,6 +144,11 @@ static struct dst_ops ip6_dst_ops_template = {
.
local_out
=
__ip6_local_out
,
};
static
unsigned
int
ip6_blackhole_default_mtu
(
const
struct
dst_entry
*
dst
)
{
return
0
;
}
static
void
ip6_rt_blackhole_update_pmtu
(
struct
dst_entry
*
dst
,
u32
mtu
)
{
}
...
...
@@ -153,6 +158,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {
.
protocol
=
cpu_to_be16
(
ETH_P_IPV6
),
.
destroy
=
ip6_dst_destroy
,
.
check
=
ip6_dst_check
,
.
default_mtu
=
ip6_blackhole_default_mtu
,
.
update_pmtu
=
ip6_rt_blackhole_update_pmtu
,
};
...
...
net/ipv6/sysctl_net_ipv6.c
浏览文件 @
bd4a6974
...
...
@@ -15,6 +15,8 @@
#include <net/addrconf.h>
#include <net/inet_frag.h>
static
struct
ctl_table
empty
[
1
];
static
ctl_table
ipv6_table_template
[]
=
{
{
.
procname
=
"route"
,
...
...
@@ -35,6 +37,12 @@ static ctl_table ipv6_table_template[] = {
.
mode
=
0644
,
.
proc_handler
=
proc_dointvec
},
{
.
procname
=
"neigh"
,
.
maxlen
=
0
,
.
mode
=
0555
,
.
child
=
empty
,
},
{
}
};
...
...
@@ -152,7 +160,6 @@ static struct ctl_table_header *ip6_base;
int
ipv6_static_sysctl_register
(
void
)
{
static
struct
ctl_table
empty
[
1
];
ip6_base
=
register_sysctl_paths
(
net_ipv6_ctl_path
,
empty
);
if
(
ip6_base
==
NULL
)
return
-
ENOMEM
;
...
...
net/netfilter/nf_conntrack_ecache.c
浏览文件 @
bd4a6974
...
...
@@ -63,6 +63,9 @@ void nf_ct_deliver_cached_events(struct nf_conn *ct)
* this does not harm and it happens very rarely. */
unsigned
long
missed
=
e
->
missed
;
if
(
!
((
events
|
missed
)
&
e
->
ctmask
))
goto
out_unlock
;
ret
=
notify
->
fcn
(
events
|
missed
,
&
item
);
if
(
unlikely
(
ret
<
0
||
missed
))
{
spin_lock_bh
(
&
ct
->
lock
);
...
...
net/netfilter/nf_conntrack_netlink.c
浏览文件 @
bd4a6974
...
...
@@ -710,6 +710,7 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
if
(
ctnetlink_fill_info
(
skb
,
NETLINK_CB
(
cb
->
skb
).
pid
,
cb
->
nlh
->
nlmsg_seq
,
IPCTNL_MSG_CT_NEW
,
ct
)
<
0
)
{
nf_conntrack_get
(
&
ct
->
ct_general
);
cb
->
args
[
1
]
=
(
unsigned
long
)
ct
;
goto
out
;
}
...
...
net/netfilter/xt_iprange.c
浏览文件 @
bd4a6974
...
...
@@ -53,15 +53,13 @@ iprange_mt4(const struct sk_buff *skb, struct xt_action_param *par)
}
static
inline
int
iprange_ipv6_
sub
(
const
struct
in6_addr
*
a
,
const
struct
in6_addr
*
b
)
iprange_ipv6_
lt
(
const
struct
in6_addr
*
a
,
const
struct
in6_addr
*
b
)
{
unsigned
int
i
;
int
r
;
for
(
i
=
0
;
i
<
4
;
++
i
)
{
r
=
ntohl
(
a
->
s6_addr32
[
i
])
-
ntohl
(
b
->
s6_addr32
[
i
]);
if
(
r
!=
0
)
return
r
;
if
(
a
->
s6_addr32
[
i
]
!=
b
->
s6_addr32
[
i
])
return
ntohl
(
a
->
s6_addr32
[
i
])
<
ntohl
(
b
->
s6_addr32
[
i
]);
}
return
0
;
...
...
@@ -75,8 +73,8 @@ iprange_mt6(const struct sk_buff *skb, struct xt_action_param *par)
bool
m
;
if
(
info
->
flags
&
IPRANGE_SRC
)
{
m
=
iprange_ipv6_
sub
(
&
iph
->
saddr
,
&
info
->
src_min
.
in6
)
<
0
;
m
|=
iprange_ipv6_
sub
(
&
iph
->
saddr
,
&
info
->
src_max
.
in6
)
>
0
;
m
=
iprange_ipv6_
lt
(
&
iph
->
saddr
,
&
info
->
src_min
.
in6
)
;
m
|=
iprange_ipv6_
lt
(
&
info
->
src_max
.
in6
,
&
iph
->
saddr
)
;
m
^=
!!
(
info
->
flags
&
IPRANGE_SRC_INV
);
if
(
m
)
{
pr_debug
(
"src IP %pI6 NOT in range %s%pI6-%pI6
\n
"
,
...
...
@@ -88,8 +86,8 @@ iprange_mt6(const struct sk_buff *skb, struct xt_action_param *par)
}
}
if
(
info
->
flags
&
IPRANGE_DST
)
{
m
=
iprange_ipv6_
sub
(
&
iph
->
daddr
,
&
info
->
dst_min
.
in6
)
<
0
;
m
|=
iprange_ipv6_
sub
(
&
iph
->
daddr
,
&
info
->
dst_max
.
in6
)
>
0
;
m
=
iprange_ipv6_
lt
(
&
iph
->
daddr
,
&
info
->
dst_min
.
in6
)
;
m
|=
iprange_ipv6_
lt
(
&
info
->
dst_max
.
in6
,
&
iph
->
daddr
)
;
m
^=
!!
(
info
->
flags
&
IPRANGE_DST_INV
);
if
(
m
)
{
pr_debug
(
"dst IP %pI6 NOT in range %s%pI6-%pI6
\n
"
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录