Lines Matching refs:neigh

87 static bool ndisc_key_eq(const struct neighbour *neigh, const void *pkey);
88 static int ndisc_constructor(struct neighbour *neigh);
89 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
90 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
305 static int ndisc_constructor(struct neighbour *neigh) in ndisc_constructor() argument
307 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; in ndisc_constructor()
308 struct net_device *dev = neigh->dev; in ndisc_constructor()
319 __neigh_parms_put(neigh->parms); in ndisc_constructor()
320 neigh->parms = neigh_parms_clone(parms); in ndisc_constructor()
322 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; in ndisc_constructor()
324 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
325 neigh->ops = &ndisc_direct_ops; in ndisc_constructor()
326 neigh->output = neigh_direct_output; in ndisc_constructor()
329 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
330 ndisc_mc_map(addr, neigh->ha, dev, 1); in ndisc_constructor()
332 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
333 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in ndisc_constructor()
335 neigh->type = RTN_LOCAL; in ndisc_constructor()
337 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
338 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in ndisc_constructor()
341 neigh->ops = &ndisc_hh_ops; in ndisc_constructor()
343 neigh->ops = &ndisc_generic_ops; in ndisc_constructor()
344 if (neigh->nud_state&NUD_VALID) in ndisc_constructor()
345 neigh->output = neigh->ops->connected_output; in ndisc_constructor()
347 neigh->output = neigh->ops->output; in ndisc_constructor()
477 void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, in ndisc_send_na() argument
554 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, in ndisc_send_ns() argument
647 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) in ndisc_error_report() argument
659 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb) in ndisc_solicit() argument
663 struct net_device *dev = neigh->dev; in ndisc_solicit()
664 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
665 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
671 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
673 if (!(neigh->nud_state & NUD_VALID)) { in ndisc_solicit()
678 ndisc_send_ns(dev, neigh, target, target, saddr); in ndisc_solicit()
679 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
680 neigh_app_ns(neigh); in ndisc_solicit()
714 struct neighbour *neigh; in ndisc_recv_ns() local
841 neigh = __neigh_lookup(&nd_tbl, saddr, dev, in ndisc_recv_ns()
843 if (neigh) in ndisc_recv_ns()
844 neigh_update(neigh, lladdr, NUD_STALE, in ndisc_recv_ns()
847 if (neigh || !dev->header_ops) { in ndisc_recv_ns()
848 ndisc_send_na(dev, neigh, saddr, &msg->target, in ndisc_recv_ns()
851 if (neigh) in ndisc_recv_ns()
852 neigh_release(neigh); in ndisc_recv_ns()
873 struct neighbour *neigh; in ndisc_recv_na() local
926 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
928 if (neigh) { in ndisc_recv_na()
929 u8 old_flags = neigh->flags; in ndisc_recv_na()
932 if (neigh->nud_state & NUD_FAILED) in ndisc_recv_na()
947 neigh_update(neigh, lladdr, in ndisc_recv_na()
954 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { in ndisc_recv_na()
962 neigh_release(neigh); in ndisc_recv_na()
970 struct neighbour *neigh; in ndisc_recv_rs() local
1009 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1010 if (neigh) { in ndisc_recv_rs()
1011 neigh_update(neigh, lladdr, NUD_STALE, in ndisc_recv_rs()
1015 neigh_release(neigh); in ndisc_recv_rs()
1070 struct neighbour *neigh = NULL; in ndisc_router_discovery() local
1186 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1187 if (!neigh) { in ndisc_router_discovery()
1213 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1214 if (!neigh) { in ndisc_router_discovery()
1221 neigh->flags |= NTF_ROUTER; in ndisc_router_discovery()
1283 if (!neigh) in ndisc_router_discovery()
1284 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1286 if (neigh) { in ndisc_router_discovery()
1297 neigh_update(neigh, lladdr, NUD_STALE, in ndisc_router_discovery()
1399 if (neigh) in ndisc_router_discovery()
1400 neigh_release(neigh); in ndisc_router_discovery()
1515 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target); in ndisc_send_redirect() local
1516 if (!neigh) { in ndisc_send_redirect()
1522 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1523 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1524 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1525 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1529 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1531 neigh_release(neigh); in ndisc_send_redirect()