Lines Matching refs:fn
144 lde_nbr_is_nexthop(struct fec_node *fn, struct lde_nbr *ln) in lde_nbr_is_nexthop() argument
148 LIST_FOREACH(fnh, &fn->nexthops, entry) in lde_nbr_is_nexthop()
159 struct fec_node *fn; in rt_dump() local
164 fn = (struct fec_node *)f; in rt_dump()
165 if (fn->local_label == NO_LABEL && in rt_dump()
166 LIST_EMPTY(&fn->downstream)) in rt_dump()
169 switch (fn->fec.type) { in rt_dump()
172 rtctl.prefix.v4 = fn->fec.u.ipv4.prefix; in rt_dump()
173 rtctl.prefixlen = fn->fec.u.ipv4.prefixlen; in rt_dump()
177 rtctl.prefix.v6 = fn->fec.u.ipv6.prefix; in rt_dump()
178 rtctl.prefixlen = fn->fec.u.ipv6.prefixlen; in rt_dump()
184 rtctl.local_label = fn->local_label; in rt_dump()
185 LIST_FOREACH(me, &fn->downstream, entry) { in rt_dump()
186 rtctl.in_use = lde_nbr_is_nexthop(fn, me->nexthop); in rt_dump()
193 if (LIST_EMPTY(&fn->downstream)) { in rt_dump()
208 struct fec_node *fn; in fec_snap() local
211 fn = (struct fec_node *)f; in fec_snap()
212 if (fn->local_label == NO_LABEL) in fec_snap()
215 lde_send_labelmapping(ln, fn, 0); in fec_snap()
240 struct fec_node *fn = arg; in fec_free() local
243 while ((fnh = LIST_FIRST(&fn->nexthops))) in fec_free()
245 if (!LIST_EMPTY(&fn->downstream)) in fec_free()
247 log_fec(&fn->fec)); in fec_free()
248 if (!LIST_EMPTY(&fn->upstream)) in fec_free()
250 log_fec(&fn->fec)); in fec_free()
252 free(fn); in fec_free()
264 struct fec_node *fn; in fec_add() local
266 fn = calloc(1, sizeof(*fn)); in fec_add()
267 if (fn == NULL) in fec_add()
270 fn->fec = *fec; in fec_add()
271 fn->local_label = NO_LABEL; in fec_add()
272 LIST_INIT(&fn->upstream); in fec_add()
273 LIST_INIT(&fn->downstream); in fec_add()
274 LIST_INIT(&fn->nexthops); in fec_add()
276 if (fec_insert(&ft, &fn->fec)) in fec_add()
278 log_fec(&fn->fec)); in fec_add()
280 return (fn); in fec_add()
284 fec_nh_find(struct fec_node *fn, int af, union ldpd_addr *nexthop, in fec_nh_find() argument
289 LIST_FOREACH(fnh, &fn->nexthops, entry) in fec_nh_find()
299 fec_nh_add(struct fec_node *fn, int af, union ldpd_addr *nexthop, in fec_nh_add() argument
312 LIST_INSERT_HEAD(&fn->nexthops, fnh, entry); in fec_nh_add()
347 struct fec_node *fn; in lde_kernel_insert() local
352 fn = (struct fec_node *)fec_find(&ft, fec); in lde_kernel_insert()
353 if (fn == NULL) in lde_kernel_insert()
354 fn = fec_add(fec); in lde_kernel_insert()
355 if (fec_nh_find(fn, af, nexthop, priority) != NULL) in lde_kernel_insert()
359 log_fec(&fn->fec), log_addr(af, nexthop)); in lde_kernel_insert()
361 if (fn->fec.type == FEC_TYPE_PWID) in lde_kernel_insert()
362 fn->data = data; in lde_kernel_insert()
364 if (fn->local_label == NO_LABEL) { in lde_kernel_insert()
366 fn->local_label = egress_label(fn->fec.type); in lde_kernel_insert()
368 fn->local_label = lde_assign_label(); in lde_kernel_insert()
372 lde_send_labelmapping(ln, fn, 1); in lde_kernel_insert()
375 fnh = fec_nh_add(fn, af, nexthop, priority); in lde_kernel_insert()
376 lde_send_change_klabel(fn, fnh); in lde_kernel_insert()
378 switch (fn->fec.type) { in lde_kernel_insert()
384 ln = lde_nbr_find_by_lsrid(fn->fec.u.pwid.lsr_id); in lde_kernel_insert()
393 me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); in lde_kernel_insert()
404 struct fec_node *fn; in lde_kernel_remove() local
408 fn = (struct fec_node *)fec_find(&ft, fec); in lde_kernel_remove()
409 if (fn == NULL) in lde_kernel_remove()
412 fnh = fec_nh_find(fn, af, nexthop, priority); in lde_kernel_remove()
418 log_fec(&fn->fec), log_addr(af, nexthop)); in lde_kernel_remove()
420 lde_send_delete_klabel(fn, fnh); in lde_kernel_remove()
422 if (LIST_EMPTY(&fn->nexthops)) { in lde_kernel_remove()
424 lde_send_labelwithdraw(ln, fn, NULL, NULL); in lde_kernel_remove()
425 fn->local_label = NO_LABEL; in lde_kernel_remove()
426 if (fn->fec.type == FEC_TYPE_PWID) in lde_kernel_remove()
427 fn->data = NULL; in lde_kernel_remove()
435 struct fec_node *fn; in lde_check_mapping() local
443 fn = (struct fec_node *)fec_find(&ft, &fec); in lde_check_mapping()
444 if (fn == NULL) in lde_check_mapping()
445 fn = fec_add(&fec); in lde_check_mapping()
448 lre = (struct lde_req *)fec_find(&ln->sent_req, &fn->fec); in lde_check_mapping()
454 if (map->type == MAP_TYPE_PWID && l2vpn_pw_negotiate(ln, fn, map)) in lde_check_mapping()
463 me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); in lde_check_mapping()
468 lde_send_labelrelease(ln, fn, NULL, me->map.label); in lde_check_mapping()
474 LIST_FOREACH(fnh, &fn->nexthops, entry) { in lde_check_mapping()
479 lde_send_delete_klabel(fn, fnh); in lde_check_mapping()
489 LIST_FOREACH(fnh, &fn->nexthops, entry) { in lde_check_mapping()
498 lde_send_change_klabel(fn, fnh); in lde_check_mapping()
501 pw = (struct l2vpn_pw *) fn->data; in lde_check_mapping()
512 lde_send_change_klabel(fn, fnh); in lde_check_mapping()
522 me = lde_map_add(ln, fn, 0); in lde_check_mapping()
541 struct fec_node *fn; in lde_check_request() local
554 fn = (struct fec_node *)fec_find(&ft, &fec); in lde_check_request()
555 if (fn == NULL || LIST_EMPTY(&fn->nexthops)) { in lde_check_request()
563 LIST_FOREACH(fnh, &fn->nexthops, entry) { in lde_check_request()
580 lre = (struct lde_req *)fec_find(&ln->recv_req, &fn->fec); in lde_check_request()
586 lre = lde_req_add(ln, &fn->fec, 0); in lde_check_request()
591 lde_send_labelmapping(ln, fn, 1); in lde_check_request()
604 struct fec_node *fn; in lde_check_request_wcard() local
608 fn = (struct fec_node *)f; in lde_check_request_wcard()
611 if (lde_wildcard_apply(map, &fn->fec, NULL) == 0) in lde_check_request_wcard()
615 if (LIST_EMPTY(&fn->nexthops)) in lde_check_request_wcard()
619 lre = (struct lde_req *)fec_find(&ln->recv_req, &fn->fec); in lde_check_request_wcard()
625 lre = lde_req_add(ln, &fn->fec, 0); in lde_check_request_wcard()
630 lde_send_labelmapping(ln, fn, 1); in lde_check_request_wcard()
664 struct fec_node *fn; in lde_check_release() local
677 fn = (struct fec_node *)fec_find(&ft, &fec); in lde_check_release()
679 if (fn == NULL) in lde_check_release()
683 lw = (struct lde_wdraw *)fec_find(&ln->sent_wdraw, &fn->fec); in lde_check_release()
690 me = (struct lde_map *)fec_find(&ln->sent_map, &fn->fec); in lde_check_release()
704 struct fec_node *fn; in lde_check_release_wcard() local
709 fn = (struct fec_node *)f; in lde_check_release_wcard()
710 me = (struct lde_map *)fec_find(&ln->sent_map, &fn->fec); in lde_check_release_wcard()
713 if (lde_wildcard_apply(map, &fn->fec, me) == 0) in lde_check_release_wcard()
717 lw = (struct lde_wdraw *)fec_find(&ln->sent_wdraw, &fn->fec); in lde_check_release_wcard()
739 struct fec_node *fn; in lde_check_withdraw() local
753 fn = (struct fec_node *)fec_find(&ft, &fec); in lde_check_withdraw()
754 if (fn == NULL) in lde_check_withdraw()
755 fn = fec_add(&fec); in lde_check_withdraw()
758 LIST_FOREACH(fnh, &fn->nexthops, entry) { in lde_check_withdraw()
766 pw = (struct l2vpn_pw *) fn->data; in lde_check_withdraw()
776 lde_send_delete_klabel(fn, fnh); in lde_check_withdraw()
781 lde_send_labelrelease(ln, fn, NULL, map->label); in lde_check_withdraw()
784 me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); in lde_check_withdraw()
794 struct fec_node *fn; in lde_check_withdraw_wcard() local
802 fn = (struct fec_node *)f; in lde_check_withdraw_wcard()
803 me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); in lde_check_withdraw_wcard()
805 if (lde_wildcard_apply(map, &fn->fec, me) == 0) in lde_check_withdraw_wcard()
809 LIST_FOREACH(fnh, &fn->nexthops, entry) { in lde_check_withdraw_wcard()
828 lde_send_delete_klabel(fn, fnh); in lde_check_withdraw_wcard()
892 struct fec_node *fn; in lde_gc_timer() local
896 fn = (struct fec_node *) fec; in lde_gc_timer()
898 if (!LIST_EMPTY(&fn->nexthops) || in lde_gc_timer()
899 !LIST_EMPTY(&fn->downstream) || in lde_gc_timer()
900 !LIST_EMPTY(&fn->upstream)) in lde_gc_timer()
903 fec_remove(&ft, &fn->fec); in lde_gc_timer()
904 free(fn); in lde_gc_timer()