diff options
| -rw-r--r-- | ldpd/l2vpn.c | 2 | ||||
| -rw-r--r-- | ldpd/lde.c | 58 | ||||
| -rw-r--r-- | ldpd/lde.h | 5 | ||||
| -rw-r--r-- | ldpd/lde_lib.c | 108 | ||||
| -rw-r--r-- | ldpd/ldp_zebra.c | 46 | ||||
| -rw-r--r-- | ldpd/ldpd.h | 3 | ||||
| -rw-r--r-- | lib/filter.c | 123 | ||||
| -rw-r--r-- | lib/if.c | 2 | ||||
| -rw-r--r-- | lib/ptm_lib.c | 2 | ||||
| -rw-r--r-- | lib/thread.c | 2 | ||||
| -rw-r--r-- | lib/vty.c | 2 | ||||
| -rw-r--r-- | lib/zclient.c | 8 | ||||
| -rw-r--r-- | pimd/pim_cmd.c | 10 | ||||
| -rw-r--r-- | pimd/pim_register.c | 6 | ||||
| -rw-r--r-- | pimd/pim_sock.c | 1 | ||||
| -rw-r--r-- | ripd/rip_interface.c | 30 | ||||
| -rw-r--r-- | zebra/zebra_mpls.c | 14 | ||||
| -rw-r--r-- | zebra/zserv.c | 26 |
18 files changed, 221 insertions, 227 deletions
diff --git a/ldpd/l2vpn.c b/ldpd/l2vpn.c index c1d0437fba..792608d425 100644 --- a/ldpd/l2vpn.c +++ b/ldpd/l2vpn.c @@ -211,6 +211,7 @@ l2vpn_pw_init(struct l2vpn_pw *pw) l2vpn_pw_fec(pw, &fec); lde_kernel_insert(&fec, AF_INET, (union ldpd_addr*)&pw->lsr_id, 0, 0, 0, (void *)pw); + lde_kernel_update(&fec); } void @@ -220,6 +221,7 @@ l2vpn_pw_exit(struct l2vpn_pw *pw) l2vpn_pw_fec(pw, &fec); lde_kernel_remove(&fec, AF_INET, (union ldpd_addr*)&pw->lsr_id, 0, 0); + lde_kernel_update(&fec); } static void diff --git a/ldpd/lde.c b/ldpd/lde.c index ff80047207..1323ba3d02 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -414,8 +414,7 @@ lde_dispatch_parent(struct thread *thread) switch (imsg.hdr.type) { case IMSG_NETWORK_ADD: - case IMSG_NETWORK_ADD_END: - case IMSG_NETWORK_DEL: + case IMSG_NETWORK_UPDATE: if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) { log_warnx("%s: wrong imsg len", __func__); break; @@ -443,12 +442,8 @@ lde_dispatch_parent(struct thread *thread) kr.ifindex, kr.priority, kr.flags & F_CONNECTED, NULL); break; - case IMSG_NETWORK_ADD_END: - lde_kernel_reevaluate(&fec); - break; - case IMSG_NETWORK_DEL: - lde_kernel_remove(&fec, kr.af, &kr.nexthop, - kr.ifindex, kr.priority); + case IMSG_NETWORK_UPDATE: + lde_kernel_update(&fec); break; } break; @@ -584,60 +579,73 @@ lde_acl_check(char *acl_name, int af, union ldpd_addr *addr, uint8_t prefixlen) } uint32_t -lde_assign_label(struct fec *fec, int connected) +lde_update_label(struct fec_node *fn) { - static uint32_t label = MPLS_LABEL_RESERVED_MAX; + static uint32_t label = MPLS_LABEL_RESERVED_MAX; + struct fec_nh *fnh; + int connected = 0; + + LIST_FOREACH(fnh, &fn->nexthops, entry) { + if (fnh->flags & F_FEC_NH_CONNECTED) { + connected = 1; + break; + } + } /* should we allocate a label for this fec? */ - switch (fec->type) { + switch (fn->fec.type) { case FEC_TYPE_IPV4: if ((ldeconf->ipv4.flags & F_LDPD_AF_ALLOCHOSTONLY) && - fec->u.ipv4.prefixlen != 32) + fn->fec.u.ipv4.prefixlen != 32) return (NO_LABEL); if (lde_acl_check(ldeconf->ipv4.acl_label_allocate_for, - AF_INET, (union ldpd_addr *)&fec->u.ipv4.prefix, - fec->u.ipv4.prefixlen) != FILTER_PERMIT) + AF_INET, (union ldpd_addr *)&fn->fec.u.ipv4.prefix, + fn->fec.u.ipv4.prefixlen) != FILTER_PERMIT) return (NO_LABEL); break; case FEC_TYPE_IPV6: if ((ldeconf->ipv6.flags & F_LDPD_AF_ALLOCHOSTONLY) && - fec->u.ipv6.prefixlen != 128) + fn->fec.u.ipv6.prefixlen != 128) return (NO_LABEL); if (lde_acl_check(ldeconf->ipv6.acl_label_allocate_for, - AF_INET6, (union ldpd_addr *)&fec->u.ipv6.prefix, - fec->u.ipv6.prefixlen) != FILTER_PERMIT) + AF_INET6, (union ldpd_addr *)&fn->fec.u.ipv6.prefix, + fn->fec.u.ipv6.prefixlen) != FILTER_PERMIT) return (NO_LABEL); break; default: - fatalx("lde_assign_label: unexpected fec type"); break; } if (connected) { /* choose implicit or explicit-null depending on configuration */ - switch (fec->type) { + switch (fn->fec.type) { case FEC_TYPE_IPV4: if (!(ldeconf->ipv4.flags & F_LDPD_AF_EXPNULL)) return (MPLS_LABEL_IMPLNULL); if (lde_acl_check(ldeconf->ipv4.acl_label_expnull_for, - AF_INET, (union ldpd_addr *)&fec->u.ipv4.prefix, - fec->u.ipv4.prefixlen) != FILTER_PERMIT) + AF_INET, (union ldpd_addr *)&fn->fec.u.ipv4.prefix, + fn->fec.u.ipv4.prefixlen) != FILTER_PERMIT) return (MPLS_LABEL_IMPLNULL); return (MPLS_LABEL_IPV4NULL); case FEC_TYPE_IPV6: if (!(ldeconf->ipv6.flags & F_LDPD_AF_EXPNULL)) return (MPLS_LABEL_IMPLNULL); if (lde_acl_check(ldeconf->ipv6.acl_label_expnull_for, - AF_INET6, (union ldpd_addr *)&fec->u.ipv6.prefix, - fec->u.ipv6.prefixlen) != FILTER_PERMIT) + AF_INET6, (union ldpd_addr *)&fn->fec.u.ipv6.prefix, + fn->fec.u.ipv6.prefixlen) != FILTER_PERMIT) return (MPLS_LABEL_IMPLNULL); return (MPLS_LABEL_IPV6NULL); default: - fatalx("lde_assign_label: unexpected fec type"); + fatalx("lde_update_label: unexpected fec type"); break; } } + /* preserve current label if there's no need to update it */ + if (fn->local_label != NO_LABEL && + fn->local_label > MPLS_LABEL_RESERVED_MAX) + return (fn->local_label); + /* * TODO: request label to zebra or define a range of labels for ldpd. */ @@ -1372,7 +1380,7 @@ lde_change_egress_label(int af) fatalx("lde_change_egress_label: unknown af"); } - fn->local_label = lde_assign_label(&fn->fec, 1); + fn->local_label = lde_update_label(fn); if (fn->local_label != NO_LABEL) RB_FOREACH(ln, nbr_tree, &lde_nbrs) lde_send_labelmapping(ln, fn, 0); diff --git a/ldpd/lde.h b/ldpd/lde.h index 7fa5219b12..e0e9873d5c 100644 --- a/ldpd/lde.h +++ b/ldpd/lde.h @@ -110,6 +110,7 @@ struct fec_nh { uint8_t flags; }; #define F_FEC_NH_NEW 0x01 +#define F_FEC_NH_CONNECTED 0x02 struct fec_node { struct fec fec; @@ -134,7 +135,7 @@ void lde(const char *, const char *); int lde_imsg_compose_parent(int, pid_t, void *, uint16_t); int lde_imsg_compose_ldpe(int, uint32_t, pid_t, void *, uint16_t); int lde_acl_check(char *, int, union ldpd_addr *, uint8_t); -uint32_t lde_assign_label(struct fec *, int); +uint32_t lde_update_label(struct fec_node *); void lde_send_change_klabel(struct fec_node *, struct fec_nh *); void lde_send_delete_klabel(struct fec_node *, struct fec_nh *); void lde_fec2map(struct fec *, struct map *); @@ -174,7 +175,7 @@ void lde_kernel_insert(struct fec *, int, union ldpd_addr *, ifindex_t, uint8_t, int, void *); void lde_kernel_remove(struct fec *, int, union ldpd_addr *, ifindex_t, uint8_t); -void lde_kernel_reevaluate(struct fec *); +void lde_kernel_update(struct fec *); void lde_check_mapping(struct map *, struct lde_nbr *); void lde_check_request(struct map *, struct lde_nbr *); void lde_check_release(struct map *, struct lde_nbr *); diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index 7a4cb760f1..234d373fbb 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -311,55 +311,19 @@ lde_kernel_insert(struct fec *fec, int af, union ldpd_addr *nexthop, { struct fec_node *fn; struct fec_nh *fnh; - struct lde_map *me; - struct lde_nbr *ln; fn = (struct fec_node *)fec_find(&ft, fec); if (fn == NULL) fn = fec_add(fec); - fnh = fec_nh_find(fn, af, nexthop, ifindex, priority); - if (fnh != NULL) { - lde_send_change_klabel(fn, fnh); - fnh->flags |= F_FEC_NH_NEW; - return; - } - - if (fn->fec.type == FEC_TYPE_PWID) + if (data) fn->data = data; - if (fn->local_label == NO_LABEL) { - fn->local_label = lde_assign_label(&fn->fec, connected); - - /* FEC.1: perform lsr label distribution procedure */ - if (fn->local_label != NO_LABEL) - RB_FOREACH(ln, nbr_tree, &lde_nbrs) - lde_send_labelmapping(ln, fn, 1); - } - - fnh = fec_nh_add(fn, af, nexthop, ifindex, priority); + fnh = fec_nh_find(fn, af, nexthop, ifindex, priority); + if (fnh == NULL) + fnh = fec_nh_add(fn, af, nexthop, ifindex, priority); fnh->flags |= F_FEC_NH_NEW; - lde_send_change_klabel(fn, fnh); - - switch (fn->fec.type) { - case FEC_TYPE_IPV4: - case FEC_TYPE_IPV6: - ln = lde_nbr_find_by_addr(af, &fnh->nexthop); - break; - case FEC_TYPE_PWID: - ln = lde_nbr_find_by_lsrid(fn->fec.u.pwid.lsr_id); - break; - default: - ln = NULL; - break; - } - - if (ln) { - /* FEC.2 */ - me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); - if (me) - /* FEC.5 */ - lde_check_mapping(&me->map, ln); - } + if (connected) + fnh->flags |= F_FEC_NH_CONNECTED; } void @@ -380,12 +344,6 @@ lde_kernel_remove(struct fec *fec, int af, union ldpd_addr *nexthop, lde_send_delete_klabel(fn, fnh); fec_nh_del(fnh); - if (LIST_EMPTY(&fn->nexthops)) { - lde_send_labelwithdraw_all(fn, NO_LABEL); - fn->local_label = NO_LABEL; - if (fn->fec.type == FEC_TYPE_PWID) - fn->data = NULL; - } } /* @@ -395,10 +353,12 @@ lde_kernel_remove(struct fec *fec, int af, union ldpd_addr *nexthop, * them (if any), withdraw the associated labels from zebra. */ void -lde_kernel_reevaluate(struct fec *fec) +lde_kernel_update(struct fec *fec) { struct fec_node *fn; struct fec_nh *fnh, *safe; + struct lde_nbr *ln; + struct lde_map *me; fn = (struct fec_node *)fec_find(&ft, fec); if (fn == NULL) @@ -407,9 +367,53 @@ lde_kernel_reevaluate(struct fec *fec) LIST_FOREACH_SAFE(fnh, &fn->nexthops, entry, safe) { if (fnh->flags & F_FEC_NH_NEW) fnh->flags &= ~F_FEC_NH_NEW; - else - lde_kernel_remove(fec, fnh->af, &fnh->nexthop, - fnh->ifindex, fnh->priority); + else { + lde_send_delete_klabel(fn, fnh); + fec_nh_del(fnh); + } + } + + if (LIST_EMPTY(&fn->nexthops)) { + lde_send_labelwithdraw_all(fn, NO_LABEL); + fn->local_label = NO_LABEL; + fn->data = NULL; + } else { + uint32_t previous_label; + + previous_label = fn->local_label; + fn->local_label = lde_update_label(fn); + + if (fn->local_label != NO_LABEL && + fn->local_label != previous_label) { + /* FEC.1: perform lsr label distribution procedure */ + RB_FOREACH(ln, nbr_tree, &lde_nbrs) + lde_send_labelmapping(ln, fn, 1); + } + } + + LIST_FOREACH(fnh, &fn->nexthops, entry) { + lde_send_change_klabel(fn, fnh); + + switch (fn->fec.type) { + case FEC_TYPE_IPV4: + case FEC_TYPE_IPV6: + ln = lde_nbr_find_by_addr(fnh->af, &fnh->nexthop); + break; + case FEC_TYPE_PWID: + ln = lde_nbr_find_by_lsrid(fn->fec.u.pwid.lsr_id); + break; + default: + ln = NULL; + break; + } + + if (ln) { + /* FEC.2 */ + me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); + if (me) + /* FEC.5 */ + lde_check_mapping(&me->map, ln); + } } } diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index 79c4f5b377..12954b91af 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -353,7 +353,7 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length, u_char type; u_char message_flags; struct kroute kr; - int nhnum, nhlen; + int nhnum = 0, nhlen; size_t nhmark; memset(&kr, 0, sizeof(kr)); @@ -374,8 +374,6 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length, stream_getl(s); /* flags, unused */ stream_getw(s); /* instance, unused */ message_flags = stream_getc(s); - if (!CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP)) - return (0); switch (command) { case ZEBRA_REDISTRIBUTE_IPV4_ADD: @@ -409,16 +407,35 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length, return (0); } - nhnum = stream_getc(s); - nhmark = stream_get_getp(s); - stream_set_getp(s, nhmark + nhnum * (nhlen + 5)); + if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP)) { + nhnum = stream_getc(s); + nhmark = stream_get_getp(s); + stream_set_getp(s, nhmark + nhnum * (nhlen + 5)); + } if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_DISTANCE)) kr.priority = stream_getc(s); if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_METRIC)) stream_getl(s); /* metric, not used */ - stream_set_getp(s, nhmark); + if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP)) + stream_set_getp(s, nhmark); + + if (nhnum == 0) { + switch (command) { + case ZEBRA_REDISTRIBUTE_IPV4_ADD: + case ZEBRA_REDISTRIBUTE_IPV6_ADD: + return (0); + case ZEBRA_REDISTRIBUTE_IPV4_DEL: + case ZEBRA_REDISTRIBUTE_IPV6_DEL: + debug_zebra_in("route delete %s/%d (%s)", + log_addr(kr.af, &kr.prefix), kr.prefixlen, + zebra_route_string(type)); + break; + default: + fatalx("ldp_zebra_read_route: unknown command"); + } + } /* loop through all the nexthops */ for (; nhnum > 0; nhnum--) { @@ -445,23 +462,12 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length, main_imsg_compose_lde(IMSG_NETWORK_ADD, 0, &kr, sizeof(kr)); break; - case ZEBRA_REDISTRIBUTE_IPV4_DEL: - case ZEBRA_REDISTRIBUTE_IPV6_DEL: - debug_zebra_in("route delete %s/%d nexthop %s " - "ifindex %u (%s)", log_addr(kr.af, &kr.prefix), - kr.prefixlen, log_addr(kr.af, &kr.nexthop), - kr.ifindex, zebra_route_string(type)); - main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &kr, - sizeof(kr)); - break; default: - fatalx("ldp_zebra_read_route: unknown command"); + break; } } - if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD || - command == ZEBRA_REDISTRIBUTE_IPV6_ADD) - main_imsg_compose_lde(IMSG_NETWORK_ADD_END, 0, &kr, sizeof(kr)); + main_imsg_compose_lde(IMSG_NETWORK_UPDATE, 0, &kr, sizeof(kr)); return (0); } diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h index fa3789a839..ff3af19db4 100644 --- a/ldpd/ldpd.h +++ b/ldpd/ldpd.h @@ -122,8 +122,7 @@ enum imsg_type { IMSG_NEIGHBOR_UP, IMSG_NEIGHBOR_DOWN, IMSG_NETWORK_ADD, - IMSG_NETWORK_ADD_END, - IMSG_NETWORK_DEL, + IMSG_NETWORK_UPDATE, IMSG_SOCKET_IPC, IMSG_SOCKET_NET, IMSG_CLOSE_SOCKETS, diff --git a/lib/filter.c b/lib/filter.c index 46e0bbe804..2b9ba87137 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -1335,25 +1335,9 @@ filter_set_zebra (struct vty *vty, const char *name_str, const char *type_str, return CMD_SUCCESS; } -/* Zebra access-list */ -DEFUN (access_list, - access_list_cmd, - "access-list WORD <deny|permit> A.B.C.D/M", - "Add an access list entry\n" - "IP zebra access-list name\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 10.0.0.0/8\n") -{ - int idx_word = 1; - int idx_permit_deny = 2; - int idx_ipv4_prefixlen = 3; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 0, 1); -} - DEFUN (access_list_exact, access_list_exact_cmd, - "access-list WORD <deny|permit> A.B.C.D/M exact-match", + "access-list WORD <deny|permit> A.B.C.D/M [exact-match]", "Add an access list entry\n" "IP zebra access-list name\n" "Specify packets to reject\n" @@ -1361,10 +1345,18 @@ DEFUN (access_list_exact, "Prefix to match. e.g. 10.0.0.0/8\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 1; int idx_permit_deny = 2; int idx_ipv4_prefixlen = 3; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 1, 1); + idx = idx_ipv4_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, + AFI_IP, argv[idx_ipv4_prefixlen]->arg, exact, 1); } DEFUN (access_list_any, @@ -1381,25 +1373,9 @@ DEFUN (access_list_any, return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, "0.0.0.0/0", 0, 1); } -DEFUN (no_access_list, - no_access_list_cmd, - "no access-list WORD <deny|permit> A.B.C.D/M", - NO_STR - "Add an access list entry\n" - "IP zebra access-list name\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 10.0.0.0/8\n") -{ - int idx_word = 2; - int idx_permit_deny = 3; - int idx_ipv4_prefixlen = 4; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 0, 0); -} - DEFUN (no_access_list_exact, no_access_list_exact_cmd, - "no access-list WORD <deny|permit> A.B.C.D/M exact-match", + "no access-list WORD <deny|permit> A.B.C.D/M [exact-match]", NO_STR "Add an access list entry\n" "IP zebra access-list name\n" @@ -1408,10 +1384,17 @@ DEFUN (no_access_list_exact, "Prefix to match. e.g. 10.0.0.0/8\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 2; int idx_permit_deny = 3; int idx_ipv4_prefixlen = 4; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 1, 0); + idx = idx_ipv4_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, exact, 0); } DEFUN (no_access_list_any, @@ -1526,27 +1509,10 @@ DEFUN (no_access_list_remark_comment, { return no_access_list_remark (self, vty, argc, argv); } - - -DEFUN (ipv6_access_list, - ipv6_access_list_cmd, - "ipv6 access-list WORD <deny|permit> X:X::X:X/M", - IPV6_STR - "Add an access list entry\n" - "IPv6 zebra access-list\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "IPv6 prefix\n") -{ - int idx = 0; - char *alname = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; - char *prefix = argv_find (argv, argc, "X:X::X:X/M", &idx) ? argv[idx]->arg : NULL; - return filter_set_zebra (vty, alname, argv[3]->text, AFI_IP6, prefix, 0, 1); -} DEFUN (ipv6_access_list_exact, ipv6_access_list_exact_cmd, - "ipv6 access-list WORD <deny|permit> X:X::X:X/M exact-match", + "ipv6 access-list WORD <deny|permit> X:X::X:X/M [exact-match]", IPV6_STR "Add an access list entry\n" "IPv6 zebra access-list\n" @@ -1555,10 +1521,18 @@ DEFUN (ipv6_access_list_exact, "IPv6 prefix\n" "Exact match of the prefixes\n") { - int idx = 0; - char *alname = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; - char *prefix = argv_find (argv, argc, "X:X::X:X/M", &idx) ? argv[idx]->arg : NULL; - return filter_set_zebra (vty, alname, argv[3]->text, AFI_IP6, prefix, 1, 1); + int idx; + int exact = 0; + int idx_word = 2; + int idx_allow = 3; + int idx_addr = 4; + idx = idx_addr; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_allow]->text, + AFI_IP6, argv[idx_addr]->arg, exact, 1); } DEFUN (ipv6_access_list_any, @@ -1576,26 +1550,9 @@ DEFUN (ipv6_access_list_any, return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, "::/0", 0, 1); } -DEFUN (no_ipv6_access_list, - no_ipv6_access_list_cmd, - "no ipv6 access-list WORD <deny|permit> X:X::X:X/M", - NO_STR - IPV6_STR - "Add an access list entry\n" - "IPv6 zebra access-list\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 3ffe:506::/32\n") -{ - int idx_word = 3; - int idx_permit_deny = 4; - int idx_ipv6_prefixlen = 5; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, argv[idx_ipv6_prefixlen]->arg, 0, 0); -} - DEFUN (no_ipv6_access_list_exact, no_ipv6_access_list_exact_cmd, - "no ipv6 access-list WORD <deny|permit> X:X::X:X/M exact-match", + "no ipv6 access-list WORD <deny|permit> X:X::X:X/M [exact-match]", NO_STR IPV6_STR "Add an access list entry\n" @@ -1605,10 +1562,18 @@ DEFUN (no_ipv6_access_list_exact, "Prefix to match. e.g. 3ffe:506::/32\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 3; int idx_permit_deny = 4; int idx_ipv6_prefixlen = 5; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, argv[idx_ipv6_prefixlen]->arg, 1, 0); + idx = idx_ipv6_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, + AFI_IP6, argv[idx_ipv6_prefixlen]->arg, exact, 0); } DEFUN (no_ipv6_access_list_any, @@ -2059,10 +2024,8 @@ access_list_init_ipv4 (void) install_element (ENABLE_NODE, &show_ip_access_list_name_cmd); /* Zebra access-list */ - install_element (CONFIG_NODE, &access_list_cmd); install_element (CONFIG_NODE, &access_list_exact_cmd); install_element (CONFIG_NODE, &access_list_any_cmd); - install_element (CONFIG_NODE, &no_access_list_cmd); install_element (CONFIG_NODE, &no_access_list_exact_cmd); install_element (CONFIG_NODE, &no_access_list_any_cmd); @@ -2152,11 +2115,9 @@ access_list_init_ipv6 (void) install_element (ENABLE_NODE, &show_ipv6_access_list_cmd); install_element (ENABLE_NODE, &show_ipv6_access_list_name_cmd); - install_element (CONFIG_NODE, &ipv6_access_list_cmd); install_element (CONFIG_NODE, &ipv6_access_list_exact_cmd); install_element (CONFIG_NODE, &ipv6_access_list_any_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_exact_cmd); - install_element (CONFIG_NODE, &no_ipv6_access_list_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_any_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_all_cmd); @@ -374,7 +374,7 @@ if_lookup_exact_address_vrf (void *src, int family, vrf_id_t vrf_id) } else if (family == AF_INET6) { - if (IPV6_ADDR_SAME (&p->u.prefix4, (struct in6_addr *)src)) + if (IPV6_ADDR_SAME (&p->u.prefix6, (struct in6_addr *)src)) return ifp; } } diff --git a/lib/ptm_lib.c b/lib/ptm_lib.c index 0666797fad..a93d7b8476 100644 --- a/lib/ptm_lib.c +++ b/lib/ptm_lib.c @@ -458,7 +458,7 @@ ptm_lib_register(char *client_name, hdl = calloc(1, sizeof(*hdl)); if (hdl) { - strcpy(hdl->client_name, client_name); + strncpy(hdl->client_name, client_name, PTMLIB_MAXNAMELEN - 1); hdl->cmd_cb = cmd_cb; hdl->notify_cb = notify_cb; hdl->response_cb = response_cb; diff --git a/lib/thread.c b/lib/thread.c index de7066bb82..28245d11a2 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -719,7 +719,7 @@ funcname_thread_add_read_write (int dir, struct thread_master *m, #else if (FD_ISSET (fd, fdset)) { - zlog (NULL, LOG_WARNING, "There is already %s fd [%d]", (dir = THREAD_READ) ? "read" : "write", fd); + zlog (NULL, LOG_WARNING, "There is already %s fd [%d]", (dir == THREAD_READ) ? "read" : "write", fd); return NULL; } @@ -2230,7 +2230,7 @@ void vty_close (struct vty *vty) { int i; - bool was_stdio; + bool was_stdio = false; /* Cancel threads.*/ if (vty->t_read) diff --git a/lib/zclient.c b/lib/zclient.c index 92662fd70f..cea4b098fc 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1146,11 +1146,15 @@ struct interface * zebra_interface_link_params_read (struct stream *s) { struct if_link_params *iflp; - uint32_t ifindex = stream_getl (s); + ifindex_t ifindex; + + assert (s); + + ifindex = stream_getl (s); struct interface *ifp = if_lookup_by_index (ifindex); - if (ifp == NULL || s == NULL) + if (ifp == NULL) { zlog_err ("%s: unknown ifindex %u, shouldn't happen", __func__, ifindex); diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 7e85253f9a..7f276b22ce 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1374,8 +1374,8 @@ pim_show_state(struct vty *vty, const char *src_or_group, const char *group, u_c for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) { char grp_str[INET_ADDRSTRLEN]; char src_str[INET_ADDRSTRLEN]; - char in_ifname[16]; - char out_ifname[16]; + char in_ifname[INTERFACE_NAMSIZ+1]; + char out_ifname[INTERFACE_NAMSIZ+1]; int oif_vif_index; struct interface *ifp_in; first_oif = 1; @@ -3036,8 +3036,8 @@ static void show_mroute(struct vty *vty, u_char uj) for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, s_route)) { char grp_str[INET_ADDRSTRLEN]; char src_str[INET_ADDRSTRLEN]; - char in_ifname[16]; - char out_ifname[16]; + char in_ifname[INTERFACE_NAMSIZ+1]; + char out_ifname[INTERFACE_NAMSIZ+1]; int oif_vif_index; struct interface *ifp_in; char proto[100]; @@ -4871,7 +4871,7 @@ DEFUN (debug_pim_packets, DEBUG_PIM_J_P_PACKETS_STR DEBUG_PIM_PIM_REG_PACKETS_STR) { - int idx; + int idx = 0; if (argv_find (argv, argc, "hello", &idx)) { PIM_DO_DEBUG_PIM_HELLO; diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 490a05be37..29b4e8a63b 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -132,6 +132,7 @@ pim_register_stop_recv (uint8_t *buf, int buf_size) upstream->join_state = PIM_UPSTREAM_PRUNE; pim_channel_del_oif (upstream->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); pim_upstream_start_register_stop_timer (upstream, 0); + break; case PIM_UPSTREAM_JOIN_PENDING: upstream->join_state = PIM_UPSTREAM_PRUNE; pim_upstream_start_register_stop_timer (upstream, 0); @@ -152,10 +153,9 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct if (PIM_DEBUG_PIM_REG) { - char rp_str[INET_ADDRSTRLEN]; - strcpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4)); zlog_debug ("Sending %s %sRegister Packet to %s", - up->sg_str, null_register ? "NULL " : "", rp_str); + up->sg_str, null_register ? "NULL " : "", + inet_ntoa (rpg->rpf_addr.u.prefix4)); } ifp = rpg->source_nexthop.interface; diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index 11cd61b592..df0095d29e 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -139,6 +139,7 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, u_char lo ret = pim_socket_bind (fd, ifp); if (ret) { + close (fd); zlog_warn("Could not set fd: %d for interface: %s to device", fd, ifp->name); return PIM_SOCK_ERR_BIND; diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index 9f8b279eb8..772ba49f93 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -585,24 +585,26 @@ rip_if_down(struct interface *ifp) struct list *list = NULL; struct listnode *listnode = NULL, *nextnode = NULL; if (rip) - for (rp = route_top (rip->table); rp; rp = route_next (rp)) - if ((list = rp->info) != NULL) - for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) - if (rinfo->ifindex == ifp->ifindex) - rip_ecmp_delete (rinfo); + { + for (rp = route_top (rip->table); rp; rp = route_next (rp)) + if ((list = rp->info) != NULL) + for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) + if (rinfo->ifindex == ifp->ifindex) + rip_ecmp_delete (rinfo); - ri = ifp->info; + ri = ifp->info; - if (ri->running) - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("turn off %s", ifp->name); + if (ri->running) + { + if (IS_RIP_DEBUG_EVENT) + zlog_debug ("turn off %s", ifp->name); - /* Leave from multicast group. */ - rip_multicast_leave (ifp, rip->sock); + /* Leave from multicast group. */ + rip_multicast_leave (ifp, rip->sock); - ri->running = 0; - } + ri->running = 0; + } + } return 0; } diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index decf3f5f8d..56a6ca7afa 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -1308,22 +1308,26 @@ mpls_ftn_update (int add, struct zebra_vrf *zvrf, enum lsp_types_t type, for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next) { - if (nexthop->type != gtype) - continue; - switch (gtype) + switch (nexthop->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV4_IFINDEX: + if (gtype != NEXTHOP_TYPE_IPV4 && gtype != NEXTHOP_TYPE_IPV4_IFINDEX) + continue; if (! IPV4_ADDR_SAME (&nexthop->gate.ipv4, &gate->ipv4)) continue; - if (gtype == NEXTHOP_TYPE_IPV4_IFINDEX && nexthop->ifindex != ifindex) + if (nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX && + nexthop->ifindex != ifindex) continue; goto found; case NEXTHOP_TYPE_IPV6: case NEXTHOP_TYPE_IPV6_IFINDEX: + if (gtype != NEXTHOP_TYPE_IPV6 && gtype != NEXTHOP_TYPE_IPV6_IFINDEX) + continue; if (! IPV6_ADDR_SAME (&nexthop->gate.ipv6, &gate->ipv6)) continue; - if (gtype == NEXTHOP_TYPE_IPV6_IFINDEX && nexthop->ifindex != ifindex) + if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX && + nexthop->ifindex != ifindex) continue; goto found; default: diff --git a/zebra/zserv.c b/zebra/zserv.c index e6455862c1..37c048f627 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -92,6 +92,7 @@ zserv_flush_data(struct thread *thread) zlog_warn("%s: buffer_flush_available failed on zserv client fd %d, " "closing", __func__, client->sock); zebra_client_close(client); + client = NULL; break; case BUFFER_PENDING: client->t_write = thread_add_write(zebrad.master, zserv_flush_data, @@ -101,7 +102,8 @@ zserv_flush_data(struct thread *thread) break; } - client->last_write_time = monotime(NULL); + if (client) + client->last_write_time = monotime(NULL); return 0; } @@ -751,28 +753,28 @@ zsend_redistribute_route (int add, struct zserv *client, struct prefix *p, /* ldpd needs all nexthops */ if (client->proto != ZEBRA_ROUTE_LDP) - break; + break; } } /* Distance */ - SET_FLAG (zapi_flags, ZAPI_MESSAGE_DISTANCE); - stream_putc (s, rib->distance); + SET_FLAG (zapi_flags, ZAPI_MESSAGE_DISTANCE); + stream_putc (s, rib->distance); /* Metric */ - SET_FLAG (zapi_flags, ZAPI_MESSAGE_METRIC); - stream_putl (s, rib->metric); + SET_FLAG (zapi_flags, ZAPI_MESSAGE_METRIC); + stream_putl (s, rib->metric); /* Tag */ - if (rib->tag) - { - SET_FLAG(zapi_flags, ZAPI_MESSAGE_TAG); + if (rib->tag) + { + SET_FLAG(zapi_flags, ZAPI_MESSAGE_TAG); stream_putl(s, rib->tag); - } + } /* MTU */ - SET_FLAG (zapi_flags, ZAPI_MESSAGE_MTU); - stream_putl (s, rib->mtu); + SET_FLAG (zapi_flags, ZAPI_MESSAGE_MTU); + stream_putl (s, rib->mtu); /* write real message flags value */ stream_putc_at (s, messmark, zapi_flags); |
