Lines Matching refs:nh
53 #define for_nexthops(fi) { int nhsel; const struct dn_fib_nh *nh;\
54 for(nhsel = 0, nh = (fi)->fib_nh; nhsel < (fi)->fib_nhs; nh++, nhsel++)
56 #define change_nexthops(fi) { int nhsel; struct dn_fib_nh *nh;\
57 for(nhsel = 0, nh = (struct dn_fib_nh *)((fi)->fib_nh); nhsel < (fi)->fib_nhs; nh++, nhsel++)
95 if (nh->nh_dev) in dn_fib_free_info()
96 dev_put(nh->nh_dev); in dn_fib_free_info()
97 nh->nh_dev = NULL; in dn_fib_free_info()
123 if (nh->nh_oif != onh->nh_oif || in dn_fib_nh_comp()
124 nh->nh_gw != onh->nh_gw || in dn_fib_nh_comp()
125 nh->nh_scope != onh->nh_scope || in dn_fib_nh_comp()
126 nh->nh_weight != onh->nh_weight || in dn_fib_nh_comp()
127 ((nh->nh_flags^onh->nh_flags)&~RTNH_F_DEAD)) in dn_fib_nh_comp()
176 nh->nh_flags = (r->rtm_flags&~0xFF) | nhp->rtnh_flags; in dn_fib_get_nhs()
177 nh->nh_oif = nhp->rtnh_ifindex; in dn_fib_get_nhs()
178 nh->nh_weight = nhp->rtnh_hops + 1; in dn_fib_get_nhs()
185 nh->nh_gw = gw_attr ? nla_get_le16(gw_attr) : 0; in dn_fib_get_nhs()
195 static int dn_fib_check_nh(const struct rtmsg *r, struct dn_fib_info *fi, struct dn_fib_nh *nh) in dn_fib_check_nh() argument
199 if (nh->nh_gw) { in dn_fib_check_nh()
203 if (nh->nh_flags&RTNH_F_ONLINK) { in dn_fib_check_nh()
208 if (dnet_addr_type(nh->nh_gw) != RTN_UNICAST) in dn_fib_check_nh()
210 if ((dev = __dev_get_by_index(&init_net, nh->nh_oif)) == NULL) in dn_fib_check_nh()
214 nh->nh_dev = dev; in dn_fib_check_nh()
216 nh->nh_scope = RT_SCOPE_LINK; in dn_fib_check_nh()
221 fld.daddr = nh->nh_gw; in dn_fib_check_nh()
222 fld.flowidn_oif = nh->nh_oif; in dn_fib_check_nh()
234 nh->nh_scope = res.scope; in dn_fib_check_nh()
235 nh->nh_oif = DN_FIB_RES_OIF(res); in dn_fib_check_nh()
236 nh->nh_dev = DN_FIB_RES_DEV(res); in dn_fib_check_nh()
237 if (nh->nh_dev == NULL) in dn_fib_check_nh()
239 dev_hold(nh->nh_dev); in dn_fib_check_nh()
241 if (!(nh->nh_dev->flags & IFF_UP)) in dn_fib_check_nh()
250 if (nh->nh_flags&(RTNH_F_PERVASIVE|RTNH_F_ONLINK)) in dn_fib_check_nh()
253 dev = __dev_get_by_index(&init_net, nh->nh_oif); in dn_fib_check_nh()
258 nh->nh_dev = dev; in dn_fib_check_nh()
259 dev_hold(nh->nh_dev); in dn_fib_check_nh()
260 nh->nh_scope = RT_SCOPE_HOST; in dn_fib_check_nh()
329 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info() local
332 nh->nh_oif = nla_get_u32(attrs[RTA_OIF]); in dn_fib_create_info()
335 nh->nh_gw = nla_get_le16(attrs[RTA_GATEWAY]); in dn_fib_create_info()
337 nh->nh_flags = r->rtm_flags; in dn_fib_create_info()
338 nh->nh_weight = 1; in dn_fib_create_info()
360 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info() local
363 if (nhs != 1 || nh->nh_gw) in dn_fib_create_info()
365 nh->nh_scope = RT_SCOPE_NOWHERE; in dn_fib_create_info()
366 nh->nh_dev = dev_get_by_index(&init_net, fi->fib_nh->nh_oif); in dn_fib_create_info()
368 if (nh->nh_dev == NULL) in dn_fib_create_info()
372 if ((err = dn_fib_check_nh(r, fi, nh)) != 0) in dn_fib_create_info()
434 if (nh->nh_flags & RTNH_F_DEAD) in dn_fib_semantic_match()
437 fld->flowidn_oif == nh->nh_oif) in dn_fib_semantic_match()
467 if (!(nh->nh_flags&RTNH_F_DEAD)) { in dn_fib_select_multipath()
468 power += nh->nh_weight; in dn_fib_select_multipath()
469 nh->nh_power = nh->nh_weight; in dn_fib_select_multipath()
483 if (!(nh->nh_flags&RTNH_F_DEAD) && nh->nh_power) { in dn_fib_select_multipath()
484 if ((w -= nh->nh_power) <= 0) { in dn_fib_select_multipath()
485 nh->nh_power--; in dn_fib_select_multipath()
719 if (nh->nh_flags&RTNH_F_DEAD) in dn_fib_sync_down()
721 else if (nh->nh_dev == dev && in dn_fib_sync_down()
722 nh->nh_scope != scope) { in dn_fib_sync_down()
724 nh->nh_flags |= RTNH_F_DEAD; in dn_fib_sync_down()
725 fi->fib_power -= nh->nh_power; in dn_fib_sync_down()
726 nh->nh_power = 0; in dn_fib_sync_down()
752 if (!(nh->nh_flags&RTNH_F_DEAD)) { in dn_fib_sync_up()
756 if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP)) in dn_fib_sync_up()
758 if (nh->nh_dev != dev || dev->dn_ptr == NULL) in dn_fib_sync_up()
762 nh->nh_power = 0; in dn_fib_sync_up()
763 nh->nh_flags &= ~RTNH_F_DEAD; in dn_fib_sync_up()