Lines Matching refs:fi

49 #define for_fib_info() { struct dn_fib_info *fi;\
50 for(fi = dn_fib_info_list; fi; fi = fi->fib_next)
53 #define for_nexthops(fi) { int nhsel; const struct dn_fib_nh *nh;\ argument
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;\ argument
57 for(nhsel = 0, nh = (struct dn_fib_nh *)((fi)->fib_nh); nhsel < (fi)->fib_nhs; nh++, nhsel++)
59 #define endfor_nexthops(fi) } argument
87 void dn_fib_free_info(struct dn_fib_info *fi) in dn_fib_free_info() argument
89 if (fi->fib_dead == 0) { in dn_fib_free_info()
94 change_nexthops(fi) { in dn_fib_free_info()
97 } endfor_nexthops(fi); in dn_fib_free_info()
98 kfree(fi); in dn_fib_free_info()
101 void dn_fib_release_info(struct dn_fib_info *fi) in dn_fib_release_info() argument
104 if (fi && refcount_dec_and_test(&fi->fib_treeref)) { in dn_fib_release_info()
105 if (fi->fib_next) in dn_fib_release_info()
106 fi->fib_next->fib_prev = fi->fib_prev; in dn_fib_release_info()
107 if (fi->fib_prev) in dn_fib_release_info()
108 fi->fib_prev->fib_next = fi->fib_next; in dn_fib_release_info()
109 if (fi == dn_fib_info_list) in dn_fib_release_info()
110 dn_fib_info_list = fi->fib_next; in dn_fib_release_info()
111 fi->fib_dead = 1; in dn_fib_release_info()
112 dn_fib_info_put(fi); in dn_fib_release_info()
117 static inline int dn_fib_nh_comp(const struct dn_fib_info *fi, const struct dn_fib_info *ofi) in dn_fib_nh_comp() argument
121 for_nexthops(fi) { in dn_fib_nh_comp()
129 } endfor_nexthops(fi); in dn_fib_nh_comp()
136 if (fi->fib_nhs != nfi->fib_nhs) in dn_fib_find_info()
138 if (nfi->fib_protocol == fi->fib_protocol && in dn_fib_find_info()
139 nfi->fib_prefsrc == fi->fib_prefsrc && in dn_fib_find_info()
140 nfi->fib_priority == fi->fib_priority && in dn_fib_find_info()
141 memcmp(nfi->fib_metrics, fi->fib_metrics, sizeof(fi->fib_metrics)) == 0 && in dn_fib_find_info()
142 ((nfi->fib_flags^fi->fib_flags)&~RTNH_F_DEAD) == 0 && in dn_fib_find_info()
143 (nfi->fib_nhs == 0 || dn_fib_nh_comp(fi, nfi) == 0)) in dn_fib_find_info()
144 return fi; in dn_fib_find_info()
163 static int dn_fib_get_nhs(struct dn_fib_info *fi, const struct nlattr *attr, in dn_fib_get_nhs() argument
169 change_nexthops(fi) { in dn_fib_get_nhs()
188 } endfor_nexthops(fi); in dn_fib_get_nhs()
194 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
270 struct dn_fib_info *fi = NULL; in dn_fib_create_info() local
284 fi = kzalloc(struct_size(fi, fib_nh, nhs), GFP_KERNEL); in dn_fib_create_info()
286 if (fi == NULL) in dn_fib_create_info()
289 fi->fib_protocol = r->rtm_protocol; in dn_fib_create_info()
290 fi->fib_nhs = nhs; in dn_fib_create_info()
291 fi->fib_flags = r->rtm_flags; in dn_fib_create_info()
294 fi->fib_priority = nla_get_u32(attrs[RTA_PRIORITY]); in dn_fib_create_info()
308 fi->fib_metrics[type-1] = nla_get_u32(attr); in dn_fib_create_info()
314 fi->fib_prefsrc = nla_get_le16(attrs[RTA_PREFSRC]); in dn_fib_create_info()
317 if ((err = dn_fib_get_nhs(fi, attrs[RTA_MULTIPATH], r)) != 0) in dn_fib_create_info()
321 fi->fib_nh->nh_oif != nla_get_u32(attrs[RTA_OIF])) in dn_fib_create_info()
325 fi->fib_nh->nh_gw != nla_get_le16(attrs[RTA_GATEWAY])) in dn_fib_create_info()
328 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info()
344 fi->fib_nh->nh_gw = nla_get_le16(attrs[RTA_GATEWAY]); in dn_fib_create_info()
359 struct dn_fib_nh *nh = fi->fib_nh; in dn_fib_create_info()
365 nh->nh_dev = dev_get_by_index(&init_net, fi->fib_nh->nh_oif); in dn_fib_create_info()
370 change_nexthops(fi) { in dn_fib_create_info()
371 if ((err = dn_fib_check_nh(r, fi, nh)) != 0) in dn_fib_create_info()
373 } endfor_nexthops(fi) in dn_fib_create_info()
376 if (fi->fib_prefsrc) { in dn_fib_create_info()
378 fi->fib_prefsrc != nla_get_le16(attrs[RTA_DST])) in dn_fib_create_info()
379 if (dnet_addr_type(fi->fib_prefsrc) != RTN_LOCAL) in dn_fib_create_info()
384 if ((ofi = dn_fib_find_info(fi)) != NULL) { in dn_fib_create_info()
385 fi->fib_dead = 1; in dn_fib_create_info()
386 dn_fib_free_info(fi); in dn_fib_create_info()
391 refcount_set(&fi->fib_treeref, 1); in dn_fib_create_info()
392 refcount_set(&fi->fib_clntref, 1); in dn_fib_create_info()
394 fi->fib_next = dn_fib_info_list; in dn_fib_create_info()
395 fi->fib_prev = NULL; in dn_fib_create_info()
397 dn_fib_info_list->fib_prev = fi; in dn_fib_create_info()
398 dn_fib_info_list = fi; in dn_fib_create_info()
400 return fi; in dn_fib_create_info()
407 if (fi) { in dn_fib_create_info()
408 fi->fib_dead = 1; in dn_fib_create_info()
409 dn_fib_free_info(fi); in dn_fib_create_info()
415 int dn_fib_semantic_match(int type, struct dn_fib_info *fi, const struct flowidn *fld, struct dn_fi… in dn_fib_semantic_match() argument
420 if (fi->fib_flags & RTNH_F_DEAD) in dn_fib_semantic_match()
423 res->fi = fi; in dn_fib_semantic_match()
428 refcount_inc(&fi->fib_clntref); in dn_fib_semantic_match()
432 for_nexthops(fi) { in dn_fib_semantic_match()
439 if (nhsel < fi->fib_nhs) { in dn_fib_semantic_match()
441 refcount_inc(&fi->fib_clntref); in dn_fib_semantic_match()
444 endfor_nexthops(fi); in dn_fib_semantic_match()
445 res->fi = NULL; in dn_fib_semantic_match()
450 res->fi = NULL; in dn_fib_semantic_match()
459 struct dn_fib_info *fi = res->fi; in dn_fib_select_multipath() local
463 if (fi->fib_power <= 0) { in dn_fib_select_multipath()
465 change_nexthops(fi) { in dn_fib_select_multipath()
470 } endfor_nexthops(fi); in dn_fib_select_multipath()
471 fi->fib_power = power; in dn_fib_select_multipath()
479 w = jiffies % fi->fib_power; in dn_fib_select_multipath()
481 change_nexthops(fi) { in dn_fib_select_multipath()
485 fi->fib_power--; in dn_fib_select_multipath()
491 } endfor_nexthops(fi); in dn_fib_select_multipath()
711 if (local && fi->fib_prefsrc == local) { in dn_fib_sync_down()
712 fi->fib_flags |= RTNH_F_DEAD; in dn_fib_sync_down()
714 } else if (dev && fi->fib_nhs) { in dn_fib_sync_down()
717 change_nexthops(fi) { in dn_fib_sync_down()
724 fi->fib_power -= nh->nh_power; in dn_fib_sync_down()
729 } endfor_nexthops(fi) in dn_fib_sync_down()
730 if (dead == fi->fib_nhs) { in dn_fib_sync_down()
731 fi->fib_flags |= RTNH_F_DEAD; in dn_fib_sync_down()
750 change_nexthops(fi) { in dn_fib_sync_up()
764 } endfor_nexthops(fi); in dn_fib_sync_up()
767 fi->fib_flags &= ~RTNH_F_DEAD; in dn_fib_sync_up()