Lines Matching refs:nh

51 #define for_nexthops(fi) { int nhsel; const struct dn_fib_nh *nh;\
52 for(nhsel = 0, nh = (fi)->fib_nh; nhsel < (fi)->fib_nhs; nh++, nhsel++)
54 #define change_nexthops(fi) { int nhsel; struct dn_fib_nh *nh;\
55 for(nhsel = 0, nh = (struct dn_fib_nh *)((fi)->fib_nh); nhsel < (fi)->fib_nhs; nh++, nhsel++)
93 if (nh->nh_dev) in dn_fib_free_info()
94 dev_put(nh->nh_dev); in dn_fib_free_info()
95 nh->nh_dev = NULL; in dn_fib_free_info()
121 if (nh->nh_oif != onh->nh_oif || in dn_fib_nh_comp()
122 nh->nh_gw != onh->nh_gw || in dn_fib_nh_comp()
123 nh->nh_scope != onh->nh_scope || in dn_fib_nh_comp()
124 nh->nh_weight != onh->nh_weight || in dn_fib_nh_comp()
125 ((nh->nh_flags^onh->nh_flags)&~RTNH_F_DEAD)) in dn_fib_nh_comp()
174 nh->nh_flags = (r->rtm_flags&~0xFF) | nhp->rtnh_flags; in dn_fib_get_nhs()
175 nh->nh_oif = nhp->rtnh_ifindex; in dn_fib_get_nhs()
176 nh->nh_weight = nhp->rtnh_hops + 1; in dn_fib_get_nhs()
182 nh->nh_gw = gw_attr ? nla_get_le16(gw_attr) : 0; in dn_fib_get_nhs()
191 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
195 if (nh->nh_gw) { in dn_fib_check_nh()
199 if (nh->nh_flags&RTNH_F_ONLINK) { in dn_fib_check_nh()
204 if (dnet_addr_type(nh->nh_gw) != RTN_UNICAST) in dn_fib_check_nh()
206 if ((dev = __dev_get_by_index(&init_net, nh->nh_oif)) == NULL) in dn_fib_check_nh()
210 nh->nh_dev = dev; in dn_fib_check_nh()
212 nh->nh_scope = RT_SCOPE_LINK; in dn_fib_check_nh()
217 fld.daddr = nh->nh_gw; in dn_fib_check_nh()
218 fld.flowidn_oif = nh->nh_oif; in dn_fib_check_nh()
230 nh->nh_scope = res.scope; in dn_fib_check_nh()
231 nh->nh_oif = DN_FIB_RES_OIF(res); in dn_fib_check_nh()
232 nh->nh_dev = DN_FIB_RES_DEV(res); in dn_fib_check_nh()
233 if (nh->nh_dev == NULL) in dn_fib_check_nh()
235 dev_hold(nh->nh_dev); in dn_fib_check_nh()
237 if (!(nh->nh_dev->flags & IFF_UP)) in dn_fib_check_nh()
246 if (nh->nh_flags&(RTNH_F_PERVASIVE|RTNH_F_ONLINK)) in dn_fib_check_nh()
249 dev = __dev_get_by_index(&init_net, nh->nh_oif); in dn_fib_check_nh()
254 nh->nh_dev = dev; in dn_fib_check_nh()
255 dev_hold(nh->nh_dev); in dn_fib_check_nh()
256 nh->nh_scope = RT_SCOPE_HOST; in dn_fib_check_nh()
325 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info() local
328 nh->nh_oif = nla_get_u32(attrs[RTA_OIF]); in dn_fib_create_info()
331 nh->nh_gw = nla_get_le16(attrs[RTA_GATEWAY]); in dn_fib_create_info()
333 nh->nh_flags = r->rtm_flags; in dn_fib_create_info()
334 nh->nh_weight = 1; in dn_fib_create_info()
356 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info() local
359 if (nhs != 1 || nh->nh_gw) in dn_fib_create_info()
361 nh->nh_scope = RT_SCOPE_NOWHERE; in dn_fib_create_info()
362 nh->nh_dev = dev_get_by_index(&init_net, fi->fib_nh->nh_oif); in dn_fib_create_info()
364 if (nh->nh_dev == NULL) in dn_fib_create_info()
368 if ((err = dn_fib_check_nh(r, fi, nh)) != 0) in dn_fib_create_info()
430 if (nh->nh_flags & RTNH_F_DEAD) in dn_fib_semantic_match()
433 fld->flowidn_oif == nh->nh_oif) in dn_fib_semantic_match()
463 if (!(nh->nh_flags&RTNH_F_DEAD)) { in dn_fib_select_multipath()
464 power += nh->nh_weight; in dn_fib_select_multipath()
465 nh->nh_power = nh->nh_weight; in dn_fib_select_multipath()
479 if (!(nh->nh_flags&RTNH_F_DEAD) && nh->nh_power) { in dn_fib_select_multipath()
480 if ((w -= nh->nh_power) <= 0) { in dn_fib_select_multipath()
481 nh->nh_power--; in dn_fib_select_multipath()
711 if (nh->nh_flags&RTNH_F_DEAD) in dn_fib_sync_down()
713 else if (nh->nh_dev == dev && in dn_fib_sync_down()
714 nh->nh_scope != scope) { in dn_fib_sync_down()
716 nh->nh_flags |= RTNH_F_DEAD; in dn_fib_sync_down()
717 fi->fib_power -= nh->nh_power; in dn_fib_sync_down()
718 nh->nh_power = 0; in dn_fib_sync_down()
744 if (!(nh->nh_flags&RTNH_F_DEAD)) { in dn_fib_sync_up()
748 if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP)) in dn_fib_sync_up()
750 if (nh->nh_dev != dev || dev->dn_ptr == NULL) in dn_fib_sync_up()
754 nh->nh_power = 0; in dn_fib_sync_up()
755 nh->nh_flags &= ~RTNH_F_DEAD; in dn_fib_sync_up()