Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
xenomai
ipipe-arm64
Commits
69cce1d1
Commit
69cce1d1
authored
Jul 17, 2011
by
David S. Miller
Browse files
net: Abstract dst->neighbour accesses behind helpers.
dst_{get,set}_neighbour() Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
9cbb7ecb
Changes
29
Hide whitespace changes
Inline
Side-by-side
drivers/infiniband/core/addr.c
View file @
69cce1d1
...
...
@@ -215,7 +215,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
neigh
=
neigh_lookup
(
&
arp_tbl
,
&
rt
->
rt_gateway
,
rt
->
dst
.
dev
);
if
(
!
neigh
||
!
(
neigh
->
nud_state
&
NUD_VALID
))
{
neigh_event_send
(
rt
->
dst
.
neighbour
,
NULL
);
neigh_event_send
(
dst_get_
neighbour
(
&
rt
->
dst
)
,
NULL
);
ret
=
-
ENODATA
;
if
(
neigh
)
goto
release
;
...
...
@@ -273,9 +273,10 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
goto
put
;
}
neigh
=
dst
->
neighbour
;
neigh
=
dst
_get_
neighbour
(
dst
)
;
if
(
!
neigh
||
!
(
neigh
->
nud_state
&
NUD_VALID
))
{
neigh_event_send
(
dst
->
neighbour
,
NULL
);
if
(
neigh
)
neigh_event_send
(
neigh
,
NULL
);
ret
=
-
ENODATA
;
goto
put
;
}
...
...
drivers/infiniband/hw/cxgb3/iwch_cm.c
View file @
69cce1d1
...
...
@@ -1328,6 +1328,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
struct
iwch_ep
*
child_ep
,
*
parent_ep
=
ctx
;
struct
cpl_pass_accept_req
*
req
=
cplhdr
(
skb
);
unsigned
int
hwtid
=
GET_TID
(
req
);
struct
neighbour
*
neigh
;
struct
dst_entry
*
dst
;
struct
l2t_entry
*
l2t
;
struct
rtable
*
rt
;
...
...
@@ -1364,7 +1365,8 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
goto
reject
;
}
dst
=
&
rt
->
dst
;
l2t
=
t3_l2t_get
(
tdev
,
dst
->
neighbour
,
dst
->
neighbour
->
dev
);
neigh
=
dst_get_neighbour
(
dst
);
l2t
=
t3_l2t_get
(
tdev
,
neigh
,
neigh
->
dev
);
if
(
!
l2t
)
{
printk
(
KERN_ERR
MOD
"%s - failed to allocate l2t entry!
\n
"
,
__func__
);
...
...
@@ -1874,10 +1876,11 @@ static int is_loopback_dst(struct iw_cm_id *cm_id)
int
iwch_connect
(
struct
iw_cm_id
*
cm_id
,
struct
iw_cm_conn_param
*
conn_param
)
{
int
err
=
0
;
struct
iwch_dev
*
h
=
to_iwch_dev
(
cm_id
->
device
);
struct
neighbour
*
neigh
;
struct
iwch_ep
*
ep
;
struct
rtable
*
rt
;
int
err
=
0
;
if
(
is_loopback_dst
(
cm_id
))
{
err
=
-
ENOSYS
;
...
...
@@ -1933,9 +1936,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
}
ep
->
dst
=
&
rt
->
dst
;
neigh
=
dst_get_neighbour
(
ep
->
dst
);
/* get a l2t entry */
ep
->
l2t
=
t3_l2t_get
(
ep
->
com
.
tdev
,
ep
->
dst
->
neighbour
,
ep
->
dst
->
neighbour
->
dev
);
ep
->
l2t
=
t3_l2t_get
(
ep
->
com
.
tdev
,
neigh
,
neigh
->
dev
);
if
(
!
ep
->
l2t
)
{
printk
(
KERN_ERR
MOD
"%s - cannot alloc l2e.
\n
"
,
__func__
);
err
=
-
ENOMEM
;
...
...
drivers/infiniband/hw/cxgb4/cm.c
View file @
69cce1d1
...
...
@@ -1325,6 +1325,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
unsigned
int
stid
=
GET_POPEN_TID
(
ntohl
(
req
->
tos_stid
));
struct
tid_info
*
t
=
dev
->
rdev
.
lldi
.
tids
;
unsigned
int
hwtid
=
GET_TID
(
req
);
struct
neighbour
*
neigh
;
struct
dst_entry
*
dst
;
struct
l2t_entry
*
l2t
;
struct
rtable
*
rt
;
...
...
@@ -1357,11 +1358,11 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
goto
reject
;
}
dst
=
&
rt
->
dst
;
if
(
dst
->
neighbour
->
dev
->
flags
&
IFF_LOOPBACK
)
{
neigh
=
dst_get_neighbour
(
dst
);
if
(
neigh
->
dev
->
flags
&
IFF_LOOPBACK
)
{
pdev
=
ip_dev_find
(
&
init_net
,
peer_ip
);
BUG_ON
(
!
pdev
);
l2t
=
cxgb4_l2t_get
(
dev
->
rdev
.
lldi
.
l2t
,
dst
->
neighbour
,
pdev
,
0
);
l2t
=
cxgb4_l2t_get
(
dev
->
rdev
.
lldi
.
l2t
,
neigh
,
pdev
,
0
);
mtu
=
pdev
->
mtu
;
tx_chan
=
cxgb4_port_chan
(
pdev
);
smac_idx
=
(
cxgb4_port_viid
(
pdev
)
&
0x7F
)
<<
1
;
...
...
@@ -1372,17 +1373,16 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
rss_qid
=
dev
->
rdev
.
lldi
.
rxq_ids
[
cxgb4_port_idx
(
pdev
)
*
step
];
dev_put
(
pdev
);
}
else
{
l2t
=
cxgb4_l2t_get
(
dev
->
rdev
.
lldi
.
l2t
,
dst
->
neighbour
,
dst
->
neighbour
->
dev
,
0
);
l2t
=
cxgb4_l2t_get
(
dev
->
rdev
.
lldi
.
l2t
,
neigh
,
neigh
->
dev
,
0
);
mtu
=
dst_mtu
(
dst
);
tx_chan
=
cxgb4_port_chan
(
dst
->
neigh
bour
->
dev
);
smac_idx
=
(
cxgb4_port_viid
(
dst
->
neigh
bour
->
dev
)
&
0x7F
)
<<
1
;
tx_chan
=
cxgb4_port_chan
(
neigh
->
dev
);
smac_idx
=
(
cxgb4_port_viid
(
neigh
->
dev
)
&
0x7F
)
<<
1
;
step
=
dev
->
rdev
.
lldi
.
ntxq
/
dev
->
rdev
.
lldi
.
nchan
;
txq_idx
=
cxgb4_port_idx
(
dst
->
neigh
bour
->
dev
)
*
step
;
ctrlq_idx
=
cxgb4_port_idx
(
dst
->
neigh
bour
->
dev
);
txq_idx
=
cxgb4_port_idx
(
neigh
->
dev
)
*
step
;
ctrlq_idx
=
cxgb4_port_idx
(
neigh
->
dev
);
step
=
dev
->
rdev
.
lldi
.
nrxq
/
dev
->
rdev
.
lldi
.
nchan
;
rss_qid
=
dev
->
rdev
.
lldi
.
rxq_ids
[
cxgb4_port_idx
(
dst
->
neigh
bour
->
dev
)
*
step
];
cxgb4_port_idx
(
neigh
->
dev
)
*
step
];
}
if
(
!
l2t
)
{
printk
(
KERN_ERR
MOD
"%s - failed to allocate l2t entry!
\n
"
,
...
...
@@ -1847,6 +1847,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct
c4iw_ep
*
ep
;
struct
rtable
*
rt
;
struct
net_device
*
pdev
;
struct
neighbour
*
neigh
;
int
step
;
if
((
conn_param
->
ord
>
c4iw_max_read_depth
)
||
...
...
@@ -1908,14 +1909,15 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
}
ep
->
dst
=
&
rt
->
dst
;
neigh
=
dst_get_neighbour
(
ep
->
dst
);
/* get a l2t entry */
if
(
ep
->
dst
->
neigh
bour
->
dev
->
flags
&
IFF_LOOPBACK
)
{
if
(
neigh
->
dev
->
flags
&
IFF_LOOPBACK
)
{
PDBG
(
"%s LOOPBACK
\n
"
,
__func__
);
pdev
=
ip_dev_find
(
&
init_net
,
cm_id
->
remote_addr
.
sin_addr
.
s_addr
);
ep
->
l2t
=
cxgb4_l2t_get
(
ep
->
com
.
dev
->
rdev
.
lldi
.
l2t
,
ep
->
dst
->
neighbour
,
pdev
,
0
);
neigh
,
pdev
,
0
);
ep
->
mtu
=
pdev
->
mtu
;
ep
->
tx_chan
=
cxgb4_port_chan
(
pdev
);
ep
->
smac_idx
=
(
cxgb4_port_viid
(
pdev
)
&
0x7F
)
<<
1
;
...
...
@@ -1930,20 +1932,18 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
dev_put
(
pdev
);
}
else
{
ep
->
l2t
=
cxgb4_l2t_get
(
ep
->
com
.
dev
->
rdev
.
lldi
.
l2t
,
ep
->
dst
->
neighbour
,
ep
->
dst
->
neighbour
->
dev
,
0
);
neigh
,
neigh
->
dev
,
0
);
ep
->
mtu
=
dst_mtu
(
ep
->
dst
);
ep
->
tx_chan
=
cxgb4_port_chan
(
ep
->
dst
->
neighbour
->
dev
);
ep
->
smac_idx
=
(
cxgb4_port_viid
(
ep
->
dst
->
neighbour
->
dev
)
&
0x7F
)
<<
1
;
ep
->
tx_chan
=
cxgb4_port_chan
(
neigh
->
dev
);
ep
->
smac_idx
=
(
cxgb4_port_viid
(
neigh
->
dev
)
&
0x7F
)
<<
1
;
step
=
ep
->
com
.
dev
->
rdev
.
lldi
.
ntxq
/
ep
->
com
.
dev
->
rdev
.
lldi
.
nchan
;
ep
->
txq_idx
=
cxgb4_port_idx
(
ep
->
dst
->
neigh
bour
->
dev
)
*
step
;
ep
->
ctrlq_idx
=
cxgb4_port_idx
(
ep
->
dst
->
neigh
bour
->
dev
);
ep
->
txq_idx
=
cxgb4_port_idx
(
neigh
->
dev
)
*
step
;
ep
->
ctrlq_idx
=
cxgb4_port_idx
(
neigh
->
dev
);
step
=
ep
->
com
.
dev
->
rdev
.
lldi
.
nrxq
/
ep
->
com
.
dev
->
rdev
.
lldi
.
nchan
;
ep
->
rss_qid
=
ep
->
com
.
dev
->
rdev
.
lldi
.
rxq_ids
[
cxgb4_port_idx
(
ep
->
dst
->
neigh
bour
->
dev
)
*
step
];
cxgb4_port_idx
(
neigh
->
dev
)
*
step
];
}
if
(
!
ep
->
l2t
)
{
printk
(
KERN_ERR
MOD
"%s - cannot alloc l2e.
\n
"
,
__func__
);
...
...
drivers/infiniband/hw/nes/nes_cm.c
View file @
69cce1d1
...
...
@@ -1151,7 +1151,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
}
if
((
neigh
==
NULL
)
||
(
!
(
neigh
->
nud_state
&
NUD_VALID
)))
neigh_event_send
(
rt
->
dst
.
neighbour
,
NULL
);
neigh_event_send
(
dst_get_
neighbour
(
&
rt
->
dst
)
,
NULL
);
ip_rt_put
(
rt
);
return
rc
;
...
...
drivers/infiniband/ulp/ipoib/ipoib_main.c
View file @
69cce1d1
...
...
@@ -560,9 +560,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
struct
ipoib_dev_priv
*
priv
=
netdev_priv
(
dev
);
struct
ipoib_path
*
path
;
struct
ipoib_neigh
*
neigh
;
struct
neighbour
*
n
;
unsigned
long
flags
;
neigh
=
ipoib_neigh_alloc
(
skb_dst
(
skb
)
->
neighbour
,
skb
->
dev
);
n
=
dst_get_neighbour
(
skb_dst
(
skb
));
neigh
=
ipoib_neigh_alloc
(
n
,
skb
->
dev
);
if
(
!
neigh
)
{
++
dev
->
stats
.
tx_dropped
;
dev_kfree_skb_any
(
skb
);
...
...
@@ -571,9 +573,9 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
path
=
__path_find
(
dev
,
skb_dst
(
skb
)
->
neighbour
->
ha
+
4
);
path
=
__path_find
(
dev
,
n
->
ha
+
4
);
if
(
!
path
)
{
path
=
path_rec_create
(
dev
,
skb_dst
(
skb
)
->
neighbour
->
ha
+
4
);
path
=
path_rec_create
(
dev
,
n
->
ha
+
4
);
if
(
!
path
)
goto
err_path
;
...
...
@@ -607,7 +609,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
}
}
else
{
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
ipoib_send
(
dev
,
skb
,
path
->
ah
,
IPOIB_QPN
(
skb_dst
(
skb
)
->
neighbour
->
ha
));
ipoib_send
(
dev
,
skb
,
path
->
ah
,
IPOIB_QPN
(
n
->
ha
));
return
;
}
}
else
{
...
...
@@ -637,17 +639,20 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
static
void
ipoib_path_lookup
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
ipoib_dev_priv
*
priv
=
netdev_priv
(
skb
->
dev
);
struct
dst_entry
*
dst
=
skb_dst
(
skb
);
struct
neighbour
*
n
;
/* Look up path record for unicasts */
if
(
skb_dst
(
skb
)
->
neighbour
->
ha
[
4
]
!=
0xff
)
{
n
=
dst_get_neighbour
(
dst
);
if
(
n
->
ha
[
4
]
!=
0xff
)
{
neigh_add_path
(
skb
,
dev
);
return
;
}
/* Add in the P_Key for multicasts */
skb_dst
(
skb
)
->
neighbour
->
ha
[
8
]
=
(
priv
->
pkey
>>
8
)
&
0xff
;
skb_dst
(
skb
)
->
neighbour
->
ha
[
9
]
=
priv
->
pkey
&
0xff
;
ipoib_mcast_send
(
dev
,
skb_dst
(
skb
)
->
neighbour
->
ha
+
4
,
skb
);
n
->
ha
[
8
]
=
(
priv
->
pkey
>>
8
)
&
0xff
;
n
->
ha
[
9
]
=
priv
->
pkey
&
0xff
;
ipoib_mcast_send
(
dev
,
n
->
ha
+
4
,
skb
);
}
static
void
unicast_arp_send
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
...
...
@@ -712,18 +717,20 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct
ipoib_dev_priv
*
priv
=
netdev_priv
(
dev
);
struct
ipoib_neigh
*
neigh
;
struct
neighbour
*
n
;
unsigned
long
flags
;
if
(
likely
(
skb_dst
(
skb
)
&&
skb_dst
(
skb
)
->
neighbour
))
{
if
(
unlikely
(
!*
to_ipoib_neigh
(
skb_dst
(
skb
)
->
neighbour
)))
{
n
=
dst_get_neighbour
(
skb_dst
(
skb
));
if
(
likely
(
skb_dst
(
skb
)
&&
n
))
{
if
(
unlikely
(
!*
to_ipoib_neigh
(
n
)))
{
ipoib_path_lookup
(
skb
,
dev
);
return
NETDEV_TX_OK
;
}
neigh
=
*
to_ipoib_neigh
(
skb_dst
(
skb
)
->
neighbour
);
neigh
=
*
to_ipoib_neigh
(
n
);
if
(
unlikely
((
memcmp
(
&
neigh
->
dgid
.
raw
,
skb_dst
(
skb
)
->
neighbour
->
ha
+
4
,
n
->
ha
+
4
,
sizeof
(
union
ib_gid
)))
||
(
neigh
->
dev
!=
dev
)))
{
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
...
...
@@ -749,7 +756,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
return
NETDEV_TX_OK
;
}
}
else
if
(
neigh
->
ah
)
{
ipoib_send
(
dev
,
skb
,
neigh
->
ah
,
IPOIB_QPN
(
skb_dst
(
skb
)
->
neighbour
->
ha
));
ipoib_send
(
dev
,
skb
,
neigh
->
ah
,
IPOIB_QPN
(
n
->
ha
));
return
NETDEV_TX_OK
;
}
...
...
@@ -812,6 +819,8 @@ static int ipoib_hard_header(struct sk_buff *skb,
const
void
*
daddr
,
const
void
*
saddr
,
unsigned
len
)
{
struct
ipoib_header
*
header
;
struct
dst_entry
*
dst
;
struct
neighbour
*
n
;
header
=
(
struct
ipoib_header
*
)
skb_push
(
skb
,
sizeof
*
header
);
...
...
@@ -823,7 +832,11 @@ static int ipoib_hard_header(struct sk_buff *skb,
* destination address onto the front of the skb so we can
* figure out where to send the packet later.
*/
if
((
!
skb_dst
(
skb
)
||
!
skb_dst
(
skb
)
->
neighbour
)
&&
daddr
)
{
dst
=
skb_dst
(
skb
);
n
=
NULL
;
if
(
dst
)
n
=
dst_get_neighbour
(
dst
);
if
((
!
dst
||
!
n
)
&&
daddr
)
{
struct
ipoib_pseudoheader
*
phdr
=
(
struct
ipoib_pseudoheader
*
)
skb_push
(
skb
,
sizeof
*
phdr
);
memcpy
(
phdr
->
hwaddr
,
daddr
,
INFINIBAND_ALEN
);
...
...
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
View file @
69cce1d1
...
...
@@ -258,11 +258,15 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
netif_tx_lock_bh
(
dev
);
while
(
!
skb_queue_empty
(
&
mcast
->
pkt_queue
))
{
struct
sk_buff
*
skb
=
skb_dequeue
(
&
mcast
->
pkt_queue
);
struct
dst_entry
*
dst
=
skb_dst
(
skb
);
struct
neighbour
*
n
=
NULL
;
netif_tx_unlock_bh
(
dev
);
skb
->
dev
=
dev
;
if
(
!
skb_dst
(
skb
)
||
!
skb_dst
(
skb
)
->
neighbour
)
{
if
(
dst
)
n
=
dst_get_neighbour
(
dst
);
if
(
!
dst
||
!
n
)
{
/* put pseudoheader back on for next time */
skb_push
(
skb
,
sizeof
(
struct
ipoib_pseudoheader
));
}
...
...
@@ -715,11 +719,13 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb)
out:
if
(
mcast
&&
mcast
->
ah
)
{
if
(
skb_dst
(
skb
)
&&
skb_dst
(
skb
)
->
neighbour
&&
!*
to_ipoib_neigh
(
skb_dst
(
skb
)
->
neighbour
))
{
struct
ipoib_neigh
*
neigh
=
ipoib_neigh_alloc
(
skb_dst
(
skb
)
->
neighbour
,
skb
->
dev
);
struct
dst_entry
*
dst
=
skb_dst
(
skb
);
struct
neighbour
*
n
=
NULL
;
if
(
dst
)
n
=
dst_get_neighbour
(
dst
);
if
(
n
&&
!*
to_ipoib_neigh
(
n
))
{
struct
ipoib_neigh
*
neigh
=
ipoib_neigh_alloc
(
n
,
skb
->
dev
);
if
(
neigh
)
{
kref_get
(
&
mcast
->
ah
->
ref
);
...
...
drivers/net/cxgb3/cxgb3_offload.c
View file @
69cce1d1
...
...
@@ -971,7 +971,7 @@ static int nb_callback(struct notifier_block *self, unsigned long event,
case
(
NETEVENT_REDIRECT
):{
struct
netevent_redirect
*
nr
=
ctx
;
cxgb_redirect
(
nr
->
old
,
nr
->
new
);
cxgb_neigh_update
(
nr
->
new
->
neighbour
);
cxgb_neigh_update
(
dst_get_neighbour
(
nr
->
new
)
);
break
;
}
default:
...
...
@@ -1116,8 +1116,8 @@ static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new)
struct
l2t_entry
*
e
;
struct
t3c_tid_entry
*
te
;
olddev
=
old
->
neighbour
->
dev
;
newdev
=
new
->
neighbour
->
dev
;
olddev
=
dst_get_
neighbour
(
old
)
->
dev
;
newdev
=
dst_get_
neighbour
(
new
)
->
dev
;
if
(
!
is_offloading
(
olddev
))
return
;
if
(
!
is_offloading
(
newdev
))
{
...
...
@@ -1134,7 +1134,7 @@ static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new)
}
/* Add new L2T entry */
e
=
t3_l2t_get
(
tdev
,
new
->
neighbour
,
newdev
);
e
=
t3_l2t_get
(
tdev
,
dst_get_
neighbour
(
new
)
,
newdev
);
if
(
!
e
)
{
printk
(
KERN_ERR
"%s: couldn't allocate new l2t entry!
\n
"
,
__func__
);
...
...
drivers/s390/net/qeth_l3_main.c
View file @
69cce1d1
...
...
@@ -2742,9 +2742,14 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
int
inline
qeth_l3_get_cast_type
(
struct
qeth_card
*
card
,
struct
sk_buff
*
skb
)
{
int
cast_type
=
RTN_UNSPEC
;
if
(
skb_dst
(
skb
)
&&
skb_dst
(
skb
)
->
neighbour
)
{
cast_type
=
skb_dst
(
skb
)
->
neighbour
->
type
;
struct
neighbour
*
n
=
NULL
;
struct
dst_entry
*
dst
;
dst
=
skb_dst
(
skb
);
if
(
dst
)
n
=
dst_get_neighbour
(
dst
);
if
(
n
)
{
cast_type
=
n
->
type
;
if
((
cast_type
==
RTN_BROADCAST
)
||
(
cast_type
==
RTN_MULTICAST
)
||
(
cast_type
==
RTN_ANYCAST
))
...
...
@@ -2787,6 +2792,9 @@ int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
static
void
qeth_l3_fill_header
(
struct
qeth_card
*
card
,
struct
qeth_hdr
*
hdr
,
struct
sk_buff
*
skb
,
int
ipv
,
int
cast_type
)
{
struct
neighbour
*
n
=
NULL
;
struct
dst_entry
*
dst
;
memset
(
hdr
,
0
,
sizeof
(
struct
qeth_hdr
));
hdr
->
hdr
.
l3
.
id
=
QETH_HEADER_TYPE_LAYER3
;
hdr
->
hdr
.
l3
.
ext_flags
=
0
;
...
...
@@ -2804,13 +2812,16 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
}
hdr
->
hdr
.
l3
.
length
=
skb
->
len
-
sizeof
(
struct
qeth_hdr
);
dst
=
skb_dst
(
skb
);
if
(
dst
)
n
=
dst_get_neighbour
(
dst
);
if
(
ipv
==
4
)
{
/* IPv4 */
hdr
->
hdr
.
l3
.
flags
=
qeth_l3_get_qeth_hdr_flags4
(
cast_type
);
memset
(
hdr
->
hdr
.
l3
.
dest_addr
,
0
,
12
);
if
(
(
skb_dst
(
skb
))
&&
(
skb_dst
(
skb
)
->
neighbour
)
)
{
if
(
n
)
{
*
((
u32
*
)
(
&
hdr
->
hdr
.
l3
.
dest_addr
[
12
]))
=
*
((
u32
*
)
skb_dst
(
skb
)
->
neighbour
->
primary_key
);
*
((
u32
*
)
n
->
primary_key
);
}
else
{
/* fill in destination address used in ip header */
*
((
u32
*
)
(
&
hdr
->
hdr
.
l3
.
dest_addr
[
12
]))
=
...
...
@@ -2821,9 +2832,9 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
hdr
->
hdr
.
l3
.
flags
=
qeth_l3_get_qeth_hdr_flags6
(
cast_type
);
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_IQD
)
hdr
->
hdr
.
l3
.
flags
&=
~
QETH_HDR_PASSTHRU
;
if
(
(
skb_dst
(
skb
))
&&
(
skb_dst
(
skb
)
->
neighbour
)
)
{
if
(
n
)
{
memcpy
(
hdr
->
hdr
.
l3
.
dest_addr
,
skb_dst
(
skb
)
->
neighbour
->
primary_key
,
16
);
n
->
primary_key
,
16
);
}
else
{
/* fill in destination address used in ip header */
memcpy
(
hdr
->
hdr
.
l3
.
dest_addr
,
...
...
drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
View file @
69cce1d1
...
...
@@ -985,7 +985,7 @@ static int init_act_open(struct cxgbi_sock *csk)
csk
->
saddr
.
sin_addr
.
s_addr
=
chba
->
ipv4addr
;
csk
->
rss_qid
=
0
;
csk
->
l2t
=
t3_l2t_get
(
t3dev
,
dst
->
neighbour
,
ndev
);
csk
->
l2t
=
t3_l2t_get
(
t3dev
,
dst
_get_
neighbour
(
dst
)
,
ndev
);
if
(
!
csk
->
l2t
)
{
pr_err
(
"NO l2t available.
\n
"
);
return
-
EINVAL
;
...
...
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
View file @
69cce1d1
...
...
@@ -1160,7 +1160,7 @@ static int init_act_open(struct cxgbi_sock *csk)
cxgbi_sock_set_flag
(
csk
,
CTPF_HAS_ATID
);
cxgbi_sock_get
(
csk
);
csk
->
l2t
=
cxgb4_l2t_get
(
lldi
->
l2t
,
csk
->
dst
->
neighbour
,
ndev
,
0
);
csk
->
l2t
=
cxgb4_l2t_get
(
lldi
->
l2t
,
dst_get_neighbour
(
csk
->
dst
)
,
ndev
,
0
);
if
(
!
csk
->
l2t
)
{
pr_err
(
"%s, cannot alloc l2t.
\n
"
,
ndev
->
name
);
goto
rel_resource
;
...
...
drivers/scsi/cxgbi/libcxgbi.c
View file @
69cce1d1
...
...
@@ -492,7 +492,7 @@ static struct cxgbi_sock *cxgbi_check_route(struct sockaddr *dst_addr)
goto
err_out
;
}
dst
=
&
rt
->
dst
;
ndev
=
dst
->
neighbour
->
dev
;
ndev
=
dst
_get_
neighbour
(
dst
)
->
dev
;
if
(
rt
->
rt_flags
&
(
RTCF_MULTICAST
|
RTCF_BROADCAST
))
{
pr_info
(
"multi-cast route %pI4, port %u, dev %s.
\n
"
,
...
...
@@ -506,7 +506,7 @@ static struct cxgbi_sock *cxgbi_check_route(struct sockaddr *dst_addr)
ndev
=
ip_dev_find
(
&
init_net
,
daddr
->
sin_addr
.
s_addr
);
mtu
=
ndev
->
mtu
;
pr_info
(
"rt dev %s, loopback -> %s, mtu %u.
\n
"
,
dst
->
neighbour
->
dev
->
name
,
ndev
->
name
,
mtu
);
dst
_get_
neighbour
(
dst
)
->
dev
->
name
,
ndev
->
name
,
mtu
);
}
cdev
=
cxgbi_device_find_by_netdev
(
ndev
,
&
port
);
...
...
include/net/dst.h
View file @
69cce1d1
...
...
@@ -37,7 +37,7 @@ struct dst_entry {
unsigned
long
_metrics
;
unsigned
long
expires
;
struct
dst_entry
*
path
;
struct
neighbour
*
neighbour
;
struct
neighbour
*
_
neighbour
;
#ifdef CONFIG_XFRM
struct
xfrm_state
*
xfrm
;
#else
...
...
@@ -86,6 +86,16 @@ struct dst_entry {
};
};
static
inline
struct
neighbour
*
dst_get_neighbour
(
struct
dst_entry
*
dst
)
{
return
dst
->
_neighbour
;
}
static
inline
void
dst_set_neighbour
(
struct
dst_entry
*
dst
,
struct
neighbour
*
neigh
)
{
dst
->
_neighbour
=
neigh
;
}
extern
u32
*
dst_cow_metrics_generic
(
struct
dst_entry
*
dst
,
unsigned
long
old
);
extern
const
u32
dst_default_metrics
[
RTAX_MAX
];
...
...
@@ -371,8 +381,10 @@ static inline void dst_rcu_free(struct rcu_head *head)
static
inline
void
dst_confirm
(
struct
dst_entry
*
dst
)
{
if
(
dst
)
neigh_confirm
(
dst
->
neighbour
);
if
(
dst
)
{
struct
neighbour
*
n
=
dst_get_neighbour
(
dst
);
neigh_confirm
(
n
);
}
}
static
inline
void
dst_link_failure
(
struct
sk_buff
*
skb
)
...
...
net/atm/clip.c
View file @
69cce1d1
...
...
@@ -362,33 +362,37 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
struct
net_device
*
dev
)
{
struct
clip_priv
*
clip_priv
=
PRIV
(
dev
);
struct
dst_entry
*
dst
=
skb_dst
(
skb
);
struct
atmarp_entry
*
entry
;
struct
neighbour
*
n
;
struct
atm_vcc
*
vcc
;
int
old
;
unsigned
long
flags
;
pr_debug
(
"(skb %p)
\n
"
,
skb
);
if
(
!
skb_dst
(
skb
)
)
{
if
(
!
dst
)
{
pr_err
(
"skb_dst(skb) == NULL
\n
"
);
dev_kfree_skb
(
skb
);
dev
->
stats
.
tx_dropped
++
;
return
NETDEV_TX_OK
;
}
if
(
!
skb_dst
(
skb
)
->
neighbour
)
{
n
=
dst_get_neighbour
(
dst
);
if
(
!
n
)
{
#if 0
skb_dst(skb)->neighbour
= clip_find_neighbour(skb_dst(skb), 1);
if (!
skb_dst(skb)->neighbour
) {
n
= clip_find_neighbour(skb_dst(skb), 1);
if (!
n
) {
dev_kfree_skb(skb); /* lost that one */
dev->stats.tx_dropped++;
return 0;
}
dst_set_neighbour(dst, n);
#endif
pr_err
(
"NO NEIGHBOUR !
\n
"
);
dev_kfree_skb
(
skb
);
dev
->
stats
.
tx_dropped
++
;
return
NETDEV_TX_OK
;
}
entry
=
NEIGH2ENTRY
(
skb_dst
(
skb
)
->
neighbour
);
entry
=
NEIGH2ENTRY
(
n
);
if
(
!
entry
->
vccs
)
{
if
(
time_after
(
jiffies
,
entry
->
expires
))
{
/* should be resolved */
...
...
@@ -405,7 +409,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
}
pr_debug
(
"neigh %p, vccs %p
\n
"
,
entry
,
entry
->
vccs
);
ATM_SKB
(
skb
)
->
vcc
=
vcc
=
entry
->
vccs
->
vcc
;
pr_debug
(
"using neighbour %p, vcc %p
\n
"
,
skb_dst
(
skb
)
->
neighbour
,
vcc
);
pr_debug
(
"using neighbour %p, vcc %p
\n
"
,
n
,
vcc
);
if
(
entry
->
vccs
->
encap
)
{
void
*
here
;
...
...
net/bridge/br_netfilter.c
View file @
69cce1d1
...
...
@@ -350,7 +350,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
if
(
!
skb
->
dev
)
goto
free_skb
;
dst
=
skb_dst
(
skb
);
neigh
=
dst
->
neighbour
;
neigh
=
dst
_get_
neighbour
(
dst
)
;
if
(
neigh
->
hh
.
hh_len
)
{
neigh_hh_bridge
(
&
neigh
->
hh
,
skb
);
skb
->
dev
=
nf_bridge
->
physindev
;
...
...
net/core/dst.c
View file @
69cce1d1
...
...
@@ -171,7 +171,7 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
dst_init_metrics
(
dst
,
dst_default_metrics
,
true
);
dst
->
expires
=
0UL
;
dst
->
path
=
dst
;
dst
->
neighbour
=
NULL
;
dst
->
_
neighbour
=
NULL
;
#ifdef CONFIG_XFRM
dst
->
xfrm
=
NULL
;
#endif
...
...
@@ -229,11 +229,11 @@ struct dst_entry *dst_destroy(struct dst_entry * dst)
smp_rmb
();
again:
neigh
=
dst
->
neighbour
;
neigh
=
dst
->
_
neighbour
;
child
=
dst
->
child
;
if
(
neigh
)
{
dst
->
neighbour
=
NULL
;
dst
->
_
neighbour
=
NULL
;
neigh_release
(
neigh
);
}
...
...
@@ -363,8 +363,8 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
dst
->
dev
=
dev_net
(
dst
->
dev
)
->
loopback_dev
;
dev_hold
(
dst
->
dev
);
dev_put
(
dev
);
if
(
dst
->
neighbour
&&
dst
->
neighbour
->
dev
==
dev
)
{
dst
->
neighbour
->
dev
=
dst
->
dev
;
if
(
dst
->
_
neighbour
&&
dst
->
_
neighbour
->
dev
==
dev
)
{
dst
->
_
neighbour
->
dev
=
dst
->
dev
;
dev_hold
(
dst
->
dev
);
dev_put
(
dev
);
}
...
...
net/core/neighbour.c
View file @
69cce1d1
...
...
@@ -1153,11 +1153,12 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
while
(
neigh
->
nud_state
&
NUD_VALID
&&
(
skb
=
__skb_dequeue
(
&
neigh
->
arp_queue
))
!=
NULL
)
{
struct
neighbour
*
n1
=
neigh
;
struct
dst_entry
*
dst
=
skb_dst
(
skb
);
struct
neighbour
*
n2
,
*
n1
=
neigh
;