mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
net: Abstract dst->neighbour accesses behind helpers.
dst_{get,set}_neighbour()
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
9cbb7ecbcf
commit
69cce1d140
29 changed files with 200 additions and 140 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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->neighbour->dev);
|
||||
smac_idx = (cxgb4_port_viid(dst->neighbour->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->neighbour->dev) * step;
|
||||
ctrlq_idx = cxgb4_port_idx(dst->neighbour->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->neighbour->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->neighbour->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->neighbour->dev) * step;
|
||||
ep->ctrlq_idx = cxgb4_port_idx(ep->dst->neighbour->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->neighbour->dev) * step];
|
||||
cxgb4_port_idx(neigh->dev) * step];
|
||||
}
|
||||
if (!ep->l2t) {
|
||||
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 @@ err_drop:
|
|||
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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue