summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldpd/l2vpn.c2
-rw-r--r--ldpd/lde.c58
-rw-r--r--ldpd/lde.h5
-rw-r--r--ldpd/lde_lib.c108
-rw-r--r--ldpd/ldp_zebra.c46
-rw-r--r--ldpd/ldpd.h3
-rw-r--r--lib/filter.c123
-rw-r--r--lib/if.c2
-rw-r--r--lib/ptm_lib.c2
-rw-r--r--lib/thread.c2
-rw-r--r--lib/vty.c2
-rw-r--r--lib/zclient.c8
-rw-r--r--pimd/pim_cmd.c10
-rw-r--r--pimd/pim_register.c6
-rw-r--r--pimd/pim_sock.c1
-rw-r--r--ripd/rip_interface.c30
-rw-r--r--zebra/zebra_mpls.c14
-rw-r--r--zebra/zserv.c26
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);
diff --git a/lib/if.c b/lib/if.c
index 20f792b8f8..6ee84e126c 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -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;
}
diff --git a/lib/vty.c b/lib/vty.c
index b6f493b6c9..2660ca3251 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -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);