Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
2573beec
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
169
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2573beec
编写于
2月 09, 2015
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Signed-off-by:
N
David S. Miller
<
davem@davemloft.net
>
上级
fd3137cd
531c94a9
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
129 addition
and
77 deletion
+129
-77
drivers/net/arcnet/com20020-pci.c
drivers/net/arcnet/com20020-pci.c
+3
-0
drivers/net/dsa/mv88e6131.c
drivers/net/dsa/mv88e6131.c
+2
-1
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+6
-5
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+43
-14
drivers/net/vxlan.c
drivers/net/vxlan.c
+1
-1
include/net/addrconf.h
include/net/addrconf.h
+3
-0
include/net/ipv6.h
include/net/ipv6.h
+0
-2
net/bridge/br_fdb.c
net/bridge/br_fdb.c
+5
-7
net/core/dev.c
net/core/dev.c
+2
-2
net/core/flow.c
net/core/flow.c
+1
-1
net/core/pktgen.c
net/core/pktgen.c
+8
-8
net/core/rtnetlink.c
net/core/rtnetlink.c
+6
-12
net/dsa/dsa.c
net/dsa/dsa.c
+1
-1
net/dsa/slave.c
net/dsa/slave.c
+0
-13
net/ipv4/tcp_fastopen.c
net/ipv4/tcp_fastopen.c
+8
-5
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+34
-2
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+3
-1
net/ipv6/output_core.c
net/ipv6/output_core.c
+3
-2
未找到文件。
drivers/net/arcnet/com20020-pci.c
浏览文件 @
2573beec
...
...
@@ -78,6 +78,9 @@ static int com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
priv
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
com20020_priv
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
ENOMEM
;
ci
=
(
struct
com20020_pci_card_info
*
)
id
->
driver_data
;
priv
->
ci
=
ci
;
...
...
drivers/net/dsa/mv88e6131.c
浏览文件 @
2573beec
...
...
@@ -139,7 +139,8 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
int
nexthop
;
nexthop
=
0x1f
;
if
(
i
!=
ds
->
index
&&
i
<
ds
->
dst
->
pd
->
nr_chips
)
if
(
ds
->
pd
->
rtable
&&
i
!=
ds
->
index
&&
i
<
ds
->
dst
->
pd
->
nr_chips
)
nexthop
=
ds
->
pd
->
rtable
[
i
]
&
0x1f
;
REG_WRITE
(
REG_GLOBAL2
,
0x06
,
0x8000
|
(
i
<<
8
)
|
nexthop
);
...
...
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
浏览文件 @
2573beec
...
...
@@ -342,12 +342,13 @@ static irqreturn_t xgbe_isr(int irq, void *data)
dma_ch_isr
=
XGMAC_DMA_IOREAD
(
channel
,
DMA_CH_SR
);
DBGPR
(
" DMA_CH%u_ISR = %08x
\n
"
,
i
,
dma_ch_isr
);
/*
If we get a TI or RI interrupt that means per channel DMA
*
interrupts are not enabled, so we use the private data napi
*
structure, not the per channel napi structure
/*
The TI or RI interrupt bits may still be set even if using
*
per channel DMA interrupts. Check to be sure those are not
*
enabled before using the private data napi structure.
*/
if
(
XGMAC_GET_BITS
(
dma_ch_isr
,
DMA_CH_SR
,
TI
)
||
XGMAC_GET_BITS
(
dma_ch_isr
,
DMA_CH_SR
,
RI
))
{
if
(
!
pdata
->
per_channel_irq
&&
(
XGMAC_GET_BITS
(
dma_ch_isr
,
DMA_CH_SR
,
TI
)
||
XGMAC_GET_BITS
(
dma_ch_isr
,
DMA_CH_SR
,
RI
)))
{
if
(
napi_schedule_prep
(
&
pdata
->
napi
))
{
/* Disable Tx and Rx interrupts */
xgbe_disable_rx_tx_ints
(
pdata
);
...
...
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
浏览文件 @
2573beec
...
...
@@ -364,6 +364,26 @@ static int sxgbe_init_rx_buffers(struct net_device *dev,
return
0
;
}
/**
* sxgbe_free_rx_buffers - free what sxgbe_init_rx_buffers() allocated
* @dev: net device structure
* @rx_ring: ring to be freed
* @rx_rsize: ring size
* Description: this function initializes the DMA RX descriptor
*/
static
void
sxgbe_free_rx_buffers
(
struct
net_device
*
dev
,
struct
sxgbe_rx_norm_desc
*
p
,
int
i
,
unsigned
int
dma_buf_sz
,
struct
sxgbe_rx_queue
*
rx_ring
)
{
struct
sxgbe_priv_data
*
priv
=
netdev_priv
(
dev
);
kfree_skb
(
rx_ring
->
rx_skbuff
[
i
]);
dma_unmap_single
(
priv
->
device
,
rx_ring
->
rx_skbuff_dma
[
i
],
dma_buf_sz
,
DMA_FROM_DEVICE
);
}
/**
* init_tx_ring - init the TX descriptor ring
* @dev: net device structure
...
...
@@ -456,7 +476,7 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
/* RX ring is not allcoated */
if
(
rx_ring
==
NULL
)
{
netdev_err
(
dev
,
"No memory for RX queue
\n
"
);
goto
error
;
return
-
ENOMEM
;
}
/* assign queue number */
...
...
@@ -468,23 +488,21 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
&
rx_ring
->
dma_rx_phy
,
GFP_KERNEL
);
if
(
rx_ring
->
dma_rx
==
NULL
)
goto
error
;
return
-
ENOMEM
;
/* allocate memory for RX skbuff array */
rx_ring
->
rx_skbuff_dma
=
kmalloc_array
(
rx_rsize
,
sizeof
(
dma_addr_t
),
GFP_KERNEL
);
if
(
!
rx_ring
->
rx_skbuff_dma
)
{
dma_free_coherent
(
priv
->
device
,
rx_rsize
*
sizeof
(
struct
sxgbe_rx_norm_desc
),
rx_ring
->
dma_rx
,
rx_ring
->
dma_rx_phy
);
goto
error
;
ret
=
-
ENOMEM
;
goto
err_free_dma_rx
;
}
rx_ring
->
rx_skbuff
=
kmalloc_array
(
rx_rsize
,
sizeof
(
struct
sk_buff
*
),
GFP_KERNEL
);
if
(
!
rx_ring
->
rx_skbuff
)
{
kfree
(
rx_ring
->
rx_skbuff_dma
)
;
goto
err
or
;
ret
=
-
ENOMEM
;
goto
err
_free_skbuff_dma
;
}
/* initialise the buffers */
...
...
@@ -494,7 +512,7 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
ret
=
sxgbe_init_rx_buffers
(
dev
,
p
,
desc_index
,
bfsize
,
rx_ring
);
if
(
ret
)
goto
err_
init
_rx_buffers
;
goto
err_
free
_rx_buffers
;
}
/* initalise counters */
...
...
@@ -504,11 +522,22 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
return
0
;
err_init_rx_buffers:
while
(
--
desc_index
>=
0
)
free_rx_ring
(
priv
->
device
,
rx_ring
,
desc_index
);
error:
return
-
ENOMEM
;
err_free_rx_buffers:
while
(
--
desc_index
>=
0
)
{
struct
sxgbe_rx_norm_desc
*
p
;
p
=
rx_ring
->
dma_rx
+
desc_index
;
sxgbe_free_rx_buffers
(
dev
,
p
,
desc_index
,
bfsize
,
rx_ring
);
}
kfree
(
rx_ring
->
rx_skbuff
);
err_free_skbuff_dma:
kfree
(
rx_ring
->
rx_skbuff_dma
);
err_free_dma_rx:
dma_free_coherent
(
priv
->
device
,
rx_rsize
*
sizeof
(
struct
sxgbe_rx_norm_desc
),
rx_ring
->
dma_rx
,
rx_ring
->
dma_rx_phy
);
return
ret
;
}
/**
* free_tx_ring - free the TX descriptor ring
...
...
drivers/net/vxlan.c
浏览文件 @
2573beec
...
...
@@ -1009,7 +1009,7 @@ static bool vxlan_snoop(struct net_device *dev,
if
(
net_ratelimit
())
netdev_info
(
dev
,
"%pM migrated from %pIS to %pIS
\n
"
,
src_mac
,
&
rdst
->
remote_ip
,
&
src_ip
);
src_mac
,
&
rdst
->
remote_ip
.
sa
,
&
src_ip
->
sa
);
rdst
->
remote_ip
=
*
src_ip
;
f
->
updated
=
jiffies
;
...
...
include/net/addrconf.h
浏览文件 @
2573beec
...
...
@@ -62,6 +62,9 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg);
int
ipv6_chk_addr
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
const
struct
net_device
*
dev
,
int
strict
);
int
ipv6_chk_addr_and_flags
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
const
struct
net_device
*
dev
,
int
strict
,
u32
banned_flags
);
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
int
ipv6_chk_home_addr
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
);
...
...
include/net/ipv6.h
浏览文件 @
2573beec
...
...
@@ -671,8 +671,6 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add
return
__ipv6_addr_diff
(
a1
,
a2
,
sizeof
(
struct
in6_addr
));
}
u32
__ipv6_select_ident
(
u32
hashrnd
,
struct
in6_addr
*
dst
,
struct
in6_addr
*
src
);
void
ipv6_select_ident
(
struct
frag_hdr
*
fhdr
,
struct
rt6_info
*
rt
);
void
ipv6_proxy_select_ident
(
struct
sk_buff
*
skb
);
...
...
net/bridge/br_fdb.c
浏览文件 @
2573beec
...
...
@@ -846,10 +846,9 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
/* VID was specified, so use it. */
err
=
__br_fdb_add
(
ndm
,
p
,
addr
,
nlh_flags
,
vid
);
}
else
{
if
(
!
pv
||
bitmap_empty
(
pv
->
vlan_bitmap
,
VLAN_N_VID
))
{
err
=
__br_fdb_add
(
ndm
,
p
,
addr
,
nlh_flags
,
0
);
err
=
__br_fdb_add
(
ndm
,
p
,
addr
,
nlh_flags
,
0
);
if
(
err
||
!
pv
)
goto
out
;
}
/* We have vlans configured on this port and user didn't
* specify a VLAN. To be nice, add/update entry for every
...
...
@@ -917,16 +916,15 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
err
=
__br_fdb_delete
(
p
,
addr
,
vid
);
}
else
{
if
(
!
pv
||
bitmap_empty
(
pv
->
vlan_bitmap
,
VLAN_N_VID
))
{
err
=
__br_fdb_delete
(
p
,
addr
,
0
);
err
=
-
ENOENT
;
err
&=
__br_fdb_delete
(
p
,
addr
,
0
);
if
(
!
pv
)
goto
out
;
}
/* We have vlans configured on this port and user didn't
* specify a VLAN. To be nice, add/update entry for every
* vlan on this port.
*/
err
=
-
ENOENT
;
for_each_set_bit
(
vid
,
pv
->
vlan_bitmap
,
VLAN_N_VID
)
{
err
&=
__br_fdb_delete
(
p
,
addr
,
vid
);
}
...
...
net/core/dev.c
浏览文件 @
2573beec
...
...
@@ -7129,11 +7129,11 @@ static int dev_cpu_callback(struct notifier_block *nfb,
/* Process offline CPU's input_pkt_queue */
while
((
skb
=
__skb_dequeue
(
&
oldsd
->
process_queue
)))
{
netif_rx_
internal
(
skb
);
netif_rx_
ni
(
skb
);
input_queue_head_incr
(
oldsd
);
}
while
((
skb
=
skb_dequeue
(
&
oldsd
->
input_pkt_queue
)))
{
netif_rx_
internal
(
skb
);
netif_rx_
ni
(
skb
);
input_queue_head_incr
(
oldsd
);
}
...
...
net/core/flow.c
浏览文件 @
2573beec
...
...
@@ -379,7 +379,7 @@ void flow_cache_flush(struct net *net)
static
void
flow_cache_flush_task
(
struct
work_struct
*
work
)
{
struct
netns_xfrm
*
xfrm
=
container_of
(
work
,
struct
netns_xfrm
,
flow_cache_
gc
_work
);
flow_cache_
flush
_work
);
struct
net
*
net
=
container_of
(
xfrm
,
struct
net
,
xfrm
);
flow_cache_flush
(
net
);
...
...
net/core/pktgen.c
浏览文件 @
2573beec
...
...
@@ -2842,25 +2842,25 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
skb
->
dev
=
odev
;
skb
->
pkt_type
=
PACKET_HOST
;
pktgen_finalize_skb
(
pkt_dev
,
skb
,
datalen
);
if
(
!
(
pkt_dev
->
flags
&
F_UDPCSUM
))
{
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
else
if
(
odev
->
features
&
NETIF_F_V4_CSUM
)
{
skb
->
ip_summed
=
CHECKSUM_PARTIAL
;
skb
->
csum
=
0
;
udp4_hwcsum
(
skb
,
udph
->
source
,
udph
->
dest
);
udp4_hwcsum
(
skb
,
iph
->
saddr
,
iph
->
daddr
);
}
else
{
__wsum
csum
=
udp_csum
(
skb
);
__wsum
csum
=
skb_checksum
(
skb
,
skb_transport_offset
(
skb
),
datalen
+
8
,
0
);
/* add protocol-dependent pseudo-header */
udph
->
check
=
csum_tcpudp_magic
(
udph
->
source
,
udph
->
dest
,
udph
->
check
=
csum_tcpudp_magic
(
iph
->
saddr
,
iph
->
daddr
,
datalen
+
8
,
IPPROTO_UDP
,
csum
);
if
(
udph
->
check
==
0
)
udph
->
check
=
CSUM_MANGLED_0
;
}
pktgen_finalize_skb
(
pkt_dev
,
skb
,
datalen
);
#ifdef CONFIG_XFRM
if
(
!
process_ipsec
(
pkt_dev
,
skb
,
protocol
))
return
NULL
;
...
...
@@ -2976,6 +2976,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
skb
->
dev
=
odev
;
skb
->
pkt_type
=
PACKET_HOST
;
pktgen_finalize_skb
(
pkt_dev
,
skb
,
datalen
);
if
(
!
(
pkt_dev
->
flags
&
F_UDPCSUM
))
{
skb
->
ip_summed
=
CHECKSUM_NONE
;
}
else
if
(
odev
->
features
&
NETIF_F_V6_CSUM
)
{
...
...
@@ -2984,7 +2986,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
skb
->
csum_offset
=
offsetof
(
struct
udphdr
,
check
);
udph
->
check
=
~
csum_ipv6_magic
(
&
iph
->
saddr
,
&
iph
->
daddr
,
udplen
,
IPPROTO_UDP
,
0
);
}
else
{
__wsum
csum
=
udp_csum
(
skb
);
__wsum
csum
=
skb_checksum
(
skb
,
skb_transport_offset
(
skb
),
udplen
,
0
);
/* add protocol-dependent pseudo-header */
udph
->
check
=
csum_ipv6_magic
(
&
iph
->
saddr
,
&
iph
->
daddr
,
udplen
,
IPPROTO_UDP
,
csum
);
...
...
@@ -2993,8 +2995,6 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
udph
->
check
=
CSUM_MANGLED_0
;
}
pktgen_finalize_skb
(
pkt_dev
,
skb
,
datalen
);
return
skb
;
}
...
...
net/core/rtnetlink.c
浏览文件 @
2573beec
...
...
@@ -1263,18 +1263,12 @@ static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = {
};
static
const
struct
nla_policy
ifla_vf_policy
[
IFLA_VF_MAX
+
1
]
=
{
[
IFLA_VF_MAC
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_mac
)
},
[
IFLA_VF_VLAN
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_vlan
)
},
[
IFLA_VF_TX_RATE
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_tx_rate
)
},
[
IFLA_VF_SPOOFCHK
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_spoofchk
)
},
[
IFLA_VF_RATE
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_rate
)
},
[
IFLA_VF_LINK_STATE
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
sizeof
(
struct
ifla_vf_link_state
)
},
[
IFLA_VF_MAC
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_mac
)
},
[
IFLA_VF_VLAN
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_vlan
)
},
[
IFLA_VF_TX_RATE
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_tx_rate
)
},
[
IFLA_VF_SPOOFCHK
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_spoofchk
)
},
[
IFLA_VF_RATE
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_rate
)
},
[
IFLA_VF_LINK_STATE
]
=
{
.
len
=
sizeof
(
struct
ifla_vf_link_state
)
},
};
static
const
struct
nla_policy
ifla_port_policy
[
IFLA_PORT_MAX
+
1
]
=
{
...
...
net/dsa/dsa.c
浏览文件 @
2573beec
...
...
@@ -603,7 +603,7 @@ static int dsa_of_probe(struct platform_device *pdev)
pdev
->
dev
.
platform_data
=
pd
;
pd
->
netdev
=
&
ethernet_dev
->
dev
;
pd
->
nr_chips
=
of_get_child_count
(
np
);
pd
->
nr_chips
=
of_get_
available_
child_count
(
np
);
if
(
pd
->
nr_chips
>
DSA_MAX_SWITCHES
)
pd
->
nr_chips
=
DSA_MAX_SWITCHES
;
...
...
net/dsa/slave.c
浏览文件 @
2573beec
...
...
@@ -676,18 +676,5 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
netif_carrier_off
(
slave_dev
);
if
(
p
->
phy
!=
NULL
)
{
if
(
ds
->
drv
->
get_phy_flags
)
p
->
phy
->
dev_flags
|=
ds
->
drv
->
get_phy_flags
(
ds
,
port
);
phy_attach
(
slave_dev
,
dev_name
(
&
p
->
phy
->
dev
),
PHY_INTERFACE_MODE_GMII
);
p
->
phy
->
autoneg
=
AUTONEG_ENABLE
;
p
->
phy
->
speed
=
0
;
p
->
phy
->
duplex
=
0
;
p
->
phy
->
advertising
=
p
->
phy
->
supported
|
ADVERTISED_Autoneg
;
}
return
slave_dev
;
}
net/ipv4/tcp_fastopen.c
浏览文件 @
2573beec
...
...
@@ -255,6 +255,9 @@ bool tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
struct
tcp_fastopen_cookie
valid_foc
=
{
.
len
=
-
1
};
bool
syn_data
=
TCP_SKB_CB
(
skb
)
->
end_seq
!=
TCP_SKB_CB
(
skb
)
->
seq
+
1
;
if
(
foc
->
len
==
0
)
/* Client requests a cookie */
NET_INC_STATS_BH
(
sock_net
(
sk
),
LINUX_MIB_TCPFASTOPENCOOKIEREQD
);
if
(
!
((
sysctl_tcp_fastopen
&
TFO_SERVER_ENABLE
)
&&
(
syn_data
||
foc
->
len
>=
0
)
&&
tcp_fastopen_queue_check
(
sk
)))
{
...
...
@@ -265,7 +268,8 @@ bool tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
if
(
syn_data
&&
(
sysctl_tcp_fastopen
&
TFO_SERVER_COOKIE_NOT_REQD
))
goto
fastopen
;
if
(
tcp_fastopen_cookie_gen
(
req
,
skb
,
&
valid_foc
)
&&
if
(
foc
->
len
>=
0
&&
/* Client presents or requests a cookie */
tcp_fastopen_cookie_gen
(
req
,
skb
,
&
valid_foc
)
&&
foc
->
len
==
TCP_FASTOPEN_COOKIE_SIZE
&&
foc
->
len
==
valid_foc
.
len
&&
!
memcmp
(
foc
->
val
,
valid_foc
.
val
,
foc
->
len
))
{
...
...
@@ -284,11 +288,10 @@ bool tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
LINUX_MIB_TCPFASTOPENPASSIVE
);
return
true
;
}
}
NET_INC_STATS_BH
(
sock_net
(
sk
),
LINUX_MIB_TCPFASTOPENPASSIVEFAIL
);
}
else
if
(
foc
->
len
>
0
)
/* Client presents an invalid cookie */
NET_INC_STATS_BH
(
sock_net
(
sk
),
LINUX_MIB_TCPFASTOPENPASSIVEFAIL
);
NET_INC_STATS_BH
(
sock_net
(
sk
),
foc
->
len
?
LINUX_MIB_TCPFASTOPENPASSIVEFAIL
:
LINUX_MIB_TCPFASTOPENCOOKIEREQD
);
*
foc
=
valid_foc
;
return
false
;
}
...
...
net/ipv6/addrconf.c
浏览文件 @
2573beec
...
...
@@ -1521,16 +1521,31 @@ static int ipv6_count_addresses(struct inet6_dev *idev)
int
ipv6_chk_addr
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
const
struct
net_device
*
dev
,
int
strict
)
{
return
ipv6_chk_addr_and_flags
(
net
,
addr
,
dev
,
strict
,
IFA_F_TENTATIVE
);
}
EXPORT_SYMBOL
(
ipv6_chk_addr
);
int
ipv6_chk_addr_and_flags
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
const
struct
net_device
*
dev
,
int
strict
,
u32
banned_flags
)
{
struct
inet6_ifaddr
*
ifp
;
unsigned
int
hash
=
inet6_addr_hash
(
addr
);
u32
ifp_flags
;
rcu_read_lock_bh
();
hlist_for_each_entry_rcu
(
ifp
,
&
inet6_addr_lst
[
hash
],
addr_lst
)
{
if
(
!
net_eq
(
dev_net
(
ifp
->
idev
->
dev
),
net
))
continue
;
/* Decouple optimistic from tentative for evaluation here.
* Ban optimistic addresses explicitly, when required.
*/
ifp_flags
=
(
ifp
->
flags
&
IFA_F_OPTIMISTIC
)
?
(
ifp
->
flags
&~
IFA_F_TENTATIVE
)
:
ifp
->
flags
;
if
(
ipv6_addr_equal
(
&
ifp
->
addr
,
addr
)
&&
!
(
ifp
->
flags
&
IFA_F_TENTATIVE
)
&&
!
(
ifp
_flags
&
banned_flags
)
&&
(
dev
==
NULL
||
ifp
->
idev
->
dev
==
dev
||
!
(
ifp
->
scope
&
(
IFA_LINK
|
IFA_HOST
)
||
strict
)))
{
rcu_read_unlock_bh
();
...
...
@@ -1541,7 +1556,7 @@ int ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
rcu_read_unlock_bh
();
return
0
;
}
EXPORT_SYMBOL
(
ipv6_chk_addr
);
EXPORT_SYMBOL
(
ipv6_chk_addr
_and_flags
);
static
bool
ipv6_chk_same_addr
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
struct
net_device
*
dev
)
...
...
@@ -4579,6 +4594,22 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
return
0
;
}
static
const
struct
nla_policy
inet6_af_policy
[
IFLA_INET6_MAX
+
1
]
=
{
[
IFLA_INET6_ADDR_GEN_MODE
]
=
{
.
type
=
NLA_U8
},
[
IFLA_INET6_TOKEN
]
=
{
.
len
=
sizeof
(
struct
in6_addr
)
},
};
static
int
inet6_validate_link_af
(
const
struct
net_device
*
dev
,
const
struct
nlattr
*
nla
)
{
struct
nlattr
*
tb
[
IFLA_INET6_MAX
+
1
];
if
(
dev
&&
!
__in6_dev_get
(
dev
))
return
-
EAFNOSUPPORT
;
return
nla_parse_nested
(
tb
,
IFLA_INET6_MAX
,
nla
,
inet6_af_policy
);
}
static
int
inet6_set_link_af
(
struct
net_device
*
dev
,
const
struct
nlattr
*
nla
)
{
int
err
=
-
EINVAL
;
...
...
@@ -5409,6 +5440,7 @@ static struct rtnl_af_ops inet6_ops __read_mostly = {
.
family
=
AF_INET6
,
.
fill_link_af
=
inet6_fill_link_af
,
.
get_link_af_size
=
inet6_get_link_af_size
,
.
validate_link_af
=
inet6_validate_link_af
,
.
set_link_af
=
inet6_set_link_af
,
};
...
...
net/ipv6/ndisc.c
浏览文件 @
2573beec
...
...
@@ -655,7 +655,9 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
struct
in6_addr
*
target
=
(
struct
in6_addr
*
)
&
neigh
->
primary_key
;
int
probes
=
atomic_read
(
&
neigh
->
probes
);
if
(
skb
&&
ipv6_chk_addr
(
dev_net
(
dev
),
&
ipv6_hdr
(
skb
)
->
saddr
,
dev
,
1
))
if
(
skb
&&
ipv6_chk_addr_and_flags
(
dev_net
(
dev
),
&
ipv6_hdr
(
skb
)
->
saddr
,
dev
,
1
,
IFA_F_TENTATIVE
|
IFA_F_OPTIMISTIC
))
saddr
=
&
ipv6_hdr
(
skb
)
->
saddr
;
probes
-=
NEIGH_VAR
(
neigh
->
parms
,
UCAST_PROBES
);
if
(
probes
<
0
)
{
...
...
net/ipv6/output_core.c
浏览文件 @
2573beec
...
...
@@ -9,7 +9,8 @@
#include <net/addrconf.h>
#include <net/secure_seq.h>
u32
__ipv6_select_ident
(
u32
hashrnd
,
struct
in6_addr
*
dst
,
struct
in6_addr
*
src
)
static
u32
__ipv6_select_ident
(
u32
hashrnd
,
struct
in6_addr
*
dst
,
struct
in6_addr
*
src
)
{
u32
hash
,
id
;
...
...
@@ -54,7 +55,7 @@ void ipv6_proxy_select_ident(struct sk_buff *skb)
id
=
__ipv6_select_ident
(
ip6_proxy_idents_hashrnd
,
&
addrs
[
1
],
&
addrs
[
0
]);
skb_shinfo
(
skb
)
->
ip6_frag_id
=
id
;
skb_shinfo
(
skb
)
->
ip6_frag_id
=
htonl
(
id
)
;
}
EXPORT_SYMBOL_GPL
(
ipv6_proxy_select_ident
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录