Module Name: src Committed By: kefren Date: Thu Jul 11 18:02:03 UTC 2013
Modified Files: src/usr.sbin/ldpd: mpls_routes.c tlv.h Log Message: add code for address and address withdraw messages get rid of unused fields in tlv struct To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/ldpd/mpls_routes.c cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/ldpd/tlv.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/ldpd/mpls_routes.c diff -u src/usr.sbin/ldpd/mpls_routes.c:1.12 src/usr.sbin/ldpd/mpls_routes.c:1.13 --- src/usr.sbin/ldpd/mpls_routes.c:1.12 Thu Jul 11 10:46:19 2013 +++ src/usr.sbin/ldpd/mpls_routes.c Thu Jul 11 18:02:03 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_routes.c,v 1.12 2013/07/11 10:46:19 kefren Exp $ */ +/* $NetBSD: mpls_routes.c,v 1.13 2013/07/11 18:02:03 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -54,6 +54,7 @@ #include "tlv_stack.h" #include "label.h" #include "mpls_routes.h" +#include "socketops.h" extern int route_socket; int rt_seq = 0; @@ -68,6 +69,7 @@ static int read_route_socket(char *, int void mask_addr(union sockunion *); int compare_sockunion(const union sockunion *, const union sockunion *); char * mpls_ntoa(union mpls_shim); +static int check_if_addr_updown(struct rt_msg * rg); extern struct sockaddr mplssockaddr; @@ -565,7 +567,6 @@ get_route(struct rt_msg * rg, const unio return LDP_E_OK; } - /* triggered when a route event occurs */ int check_route(struct rt_msg * rg, uint rlen) @@ -580,19 +581,18 @@ check_route(struct rt_msg * rg, uint rle gate[0] = 0; pref[0] = 0; - if (rlen <= sizeof(struct rt_msghdr)) - return LDP_E_ROUTE_ERROR; - - if (rg->m_rtm.rtm_version != RTM_VERSION) + if (rlen <= sizeof(struct rt_msghdr) || + rg->m_rtm.rtm_version != RTM_VERSION) return LDP_E_ROUTE_ERROR; - if ((rg->m_rtm.rtm_flags & RTF_DONE) == 0) + if (rg->m_rtm.rtm_type == RTM_NEWADDR || + rg->m_rtm.rtm_type == RTM_DELADDR) + return check_if_addr_updown(rg); + if (rg->m_rtm.rtm_pid == getpid() || + ((rg->m_rtm.rtm_flags & RTF_DONE) == 0)) return LDP_E_OK; - if (rg->m_rtm.rtm_pid == getpid()) /* We did it.. */ - return LDP_E_OK; - else - debugp("Check route triggered by PID: %d\n", rg->m_rtm.rtm_pid); + debugp("Check route triggered by PID: %d\n", rg->m_rtm.rtm_pid); so_dest = (union sockunion *) rg->m_space; @@ -738,6 +738,48 @@ check_route(struct rt_msg * rg, uint rle return LDP_E_OK; } +/* + * Checks NEWADDR and DELADDR messages and sends announcements accordingly + */ +static int +check_if_addr_updown(struct rt_msg * rg) +{ + union sockunion *ifa, *netmask; + struct ldp_peer *p; + struct address_list_tlv al_tlv; + + if ((rg->m_rtm.rtm_addrs & RTA_NETMASK) == 0 || + (rg->m_rtm.rtm_addrs & RTA_IFA) == 0) + return LDP_E_ROUTE_ERROR; + + ifa = netmask = (union sockunion *) rg->m_space; + if (netmask->sa.sa_family != AF_INET) + return LDP_E_OK; + + if (rg->m_rtm.rtm_addrs & RTA_IFP) + ifa = GETNEXT(netmask); + ifa = GETNEXT(ifa); + + if (ifa->sa.sa_family != AF_INET) + return LDP_E_OK; + + memset(&al_tlv, 0, sizeof(al_tlv)); + al_tlv.type = rg->m_rtm.rtm_type == RTM_NEWADDR ? htons(LDP_ADDRESS) : + htons(LDP_ADDRESS_WITHDRAW); + al_tlv.length = htons(sizeof(al_tlv) - TLV_TYPE_LENGTH); + al_tlv.messageid = htonl(get_message_id()); + al_tlv.a_type = htons(TLV_ADDRESS_LIST); + al_tlv.a_length = htons(sizeof(al_tlv.a_af) + sizeof(al_tlv.a_address)); + al_tlv.a_af = htons(LDP_AF_INET); + memcpy(&al_tlv.a_address, &ifa->sin.sin_addr, sizeof(al_tlv.a_address)); + + SLIST_FOREACH(p, &ldp_peer_head, peers) + if (p->state == LDP_PEER_ESTABLISHED) + send_tlv(p, (struct tlv *)&al_tlv); + + return LDP_E_OK; +} + int bind_current_routes() { Index: src/usr.sbin/ldpd/tlv.h diff -u src/usr.sbin/ldpd/tlv.h:1.3 src/usr.sbin/ldpd/tlv.h:1.4 --- src/usr.sbin/ldpd/tlv.h:1.3 Sat Jan 26 17:29:55 2013 +++ src/usr.sbin/ldpd/tlv.h Thu Jul 11 18:02:03 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tlv.h,v 1.3 2013/01/26 17:29:55 kefren Exp $ */ +/* $NetBSD: tlv.h,v 1.4 2013/07/11 18:02:03 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -62,8 +62,6 @@ struct tlv { uint16_t type; uint16_t length; uint32_t messageid; - void *value; - struct ldp_pdu *pdu; } __packed; /* Common Hello TLV structure */