diff options
author | whitespace / reindent <invalid@invalid.invalid> | 2017-07-17 14:03:14 +0200 |
---|---|---|
committer | whitespace / reindent <invalid@invalid.invalid> | 2017-07-17 14:04:07 +0200 |
commit | d62a17aedeb0eebdba98238874bb13d62c48dbf9 (patch) | |
tree | 3b319b1d61c8b85b4d1f06adf8b844bb8a9b5107 /zebra/irdp_main.c | |
parent | *: add indent control files (diff) | |
download | frr-d62a17aedeb0eebdba98238874bb13d62c48dbf9.tar.xz frr-d62a17aedeb0eebdba98238874bb13d62c48dbf9.zip |
*: reindentreindent-master-after
indent.py `git ls-files | pcregrep '\.[ch]$' | pcregrep -v '^(ldpd|babeld|nhrpd)/'`
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'zebra/irdp_main.c')
-rw-r--r-- | zebra/irdp_main.c | 440 |
1 files changed, 218 insertions, 222 deletions
diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c index a155331c9..6220c9d81 100644 --- a/zebra/irdp_main.c +++ b/zebra/irdp_main.c @@ -20,14 +20,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* +/* * This work includes work with the following copywrite: * * Copyright (C) 1997, 2000 Kunihiro Ishiguro * */ -/* +/* * Thanks to Jens Låås at Swedish University of Agricultural Sciences * for reviewing and tests. */ @@ -74,262 +74,258 @@ struct thread *t_irdp_raw; /* Timer interval of irdp. */ int irdp_timer_interval = IRDP_DEFAULT_INTERVAL; -int -irdp_sock_init (void) +int irdp_sock_init(void) { - int ret, i; - int save_errno; - int sock; - - if ( zserv_privs.change (ZPRIVS_RAISE) ) - zlog_err ("irdp_sock_init: could not raise privs, %s", - safe_strerror (errno) ); - - sock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); - save_errno = errno; - - if ( zserv_privs.change (ZPRIVS_LOWER) ) - zlog_err ("irdp_sock_init: could not lower privs, %s", - safe_strerror (errno) ); - - if (sock < 0) { - zlog_warn ("IRDP: can't create irdp socket %s", safe_strerror(save_errno)); - return sock; - }; - - i = 1; - ret = setsockopt (sock, IPPROTO_IP, IP_TTL, - (void *) &i, sizeof (i)); - if (ret < 0) { - zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno)); - close(sock); - return ret; - }; - - ret = setsockopt_ifindex (AF_INET, sock, 1); - if (ret < 0) { - zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno)); - close(sock); - return ret; - }; - - t_irdp_raw = NULL; - thread_add_read(zebrad.master, irdp_read_raw, NULL, sock, &t_irdp_raw); - - return sock; + int ret, i; + int save_errno; + int sock; + + if (zserv_privs.change(ZPRIVS_RAISE)) + zlog_err("irdp_sock_init: could not raise privs, %s", + safe_strerror(errno)); + + sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + save_errno = errno; + + if (zserv_privs.change(ZPRIVS_LOWER)) + zlog_err("irdp_sock_init: could not lower privs, %s", + safe_strerror(errno)); + + if (sock < 0) { + zlog_warn("IRDP: can't create irdp socket %s", + safe_strerror(save_errno)); + return sock; + }; + + i = 1; + ret = setsockopt(sock, IPPROTO_IP, IP_TTL, (void *)&i, sizeof(i)); + if (ret < 0) { + zlog_warn("IRDP: can't do irdp sockopt %s", + safe_strerror(errno)); + close(sock); + return ret; + }; + + ret = setsockopt_ifindex(AF_INET, sock, 1); + if (ret < 0) { + zlog_warn("IRDP: can't do irdp sockopt %s", + safe_strerror(errno)); + close(sock); + return ret; + }; + + t_irdp_raw = NULL; + thread_add_read(zebrad.master, irdp_read_raw, NULL, sock, &t_irdp_raw); + + return sock; } -static int -get_pref(struct irdp_interface *irdp, struct prefix *p) +static int get_pref(struct irdp_interface *irdp, struct prefix *p) { - struct listnode *node; - struct Adv *adv; - - /* Use default preference or use the override pref */ - - if( irdp->AdvPrefList == NULL ) - return irdp->Preference; - - for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv)) - if( p->u.prefix4.s_addr == adv->ip.s_addr ) - return adv->pref; - - return irdp->Preference; + struct listnode *node; + struct Adv *adv; + + /* Use default preference or use the override pref */ + + if (irdp->AdvPrefList == NULL) + return irdp->Preference; + + for (ALL_LIST_ELEMENTS_RO(irdp->AdvPrefList, node, adv)) + if (p->u.prefix4.s_addr == adv->ip.s_addr) + return adv->pref; + + return irdp->Preference; } /* Make ICMP Router Advertisement Message. */ -static int -make_advertisement_packet (struct interface *ifp, - struct prefix *p, - struct stream *s) +static int make_advertisement_packet(struct interface *ifp, struct prefix *p, + struct stream *s) { - struct zebra_if *zi=ifp->info; - struct irdp_interface *irdp=&zi->irdp; - int size; - int pref; - u_int16_t checksum; - - pref = get_pref(irdp, p); - - stream_putc (s, ICMP_ROUTERADVERT); /* Type. */ - stream_putc (s, 0); /* Code. */ - stream_putw (s, 0); /* Checksum. */ - stream_putc (s, 1); /* Num address. */ - stream_putc (s, 2); /* Address Entry Size. */ - - if(irdp->flags & IF_SHUTDOWN) - stream_putw (s, 0); - else - stream_putw (s, irdp->Lifetime); - - stream_putl (s, htonl(p->u.prefix4.s_addr)); /* Router address. */ - stream_putl (s, pref); - - /* in_cksum return network byte order value */ - size = 16; - checksum = in_cksum (s->data, size); - stream_putw_at (s, 2, htons(checksum)); - - return size; + struct zebra_if *zi = ifp->info; + struct irdp_interface *irdp = &zi->irdp; + int size; + int pref; + u_int16_t checksum; + + pref = get_pref(irdp, p); + + stream_putc(s, ICMP_ROUTERADVERT); /* Type. */ + stream_putc(s, 0); /* Code. */ + stream_putw(s, 0); /* Checksum. */ + stream_putc(s, 1); /* Num address. */ + stream_putc(s, 2); /* Address Entry Size. */ + + if (irdp->flags & IF_SHUTDOWN) + stream_putw(s, 0); + else + stream_putw(s, irdp->Lifetime); + + stream_putl(s, htonl(p->u.prefix4.s_addr)); /* Router address. */ + stream_putl(s, pref); + + /* in_cksum return network byte order value */ + size = 16; + checksum = in_cksum(s->data, size); + stream_putw_at(s, 2, htons(checksum)); + + return size; } -static void -irdp_send(struct interface *ifp, struct prefix *p, struct stream *s) +static void irdp_send(struct interface *ifp, struct prefix *p, struct stream *s) { - struct zebra_if *zi=ifp->info; - struct irdp_interface *irdp=&zi->irdp; - char buf[PREFIX_STRLEN]; - u_int32_t dst; - u_int32_t ttl=1; - - if (! (ifp->flags & IFF_UP)) return; - - if (irdp->flags & IF_BROADCAST) - dst =INADDR_BROADCAST ; - else - dst = htonl(INADDR_ALLHOSTS_GROUP); - - if(irdp->flags & IF_DEBUG_MESSAGES) - zlog_debug("IRDP: TX Advert on %s %s Holdtime=%d Preference=%d", - ifp->name, - prefix2str(p, buf, sizeof buf), - irdp->flags & IF_SHUTDOWN? 0 : irdp->Lifetime, - get_pref(irdp, p)); - - send_packet (ifp, s, dst, p, ttl); + struct zebra_if *zi = ifp->info; + struct irdp_interface *irdp = &zi->irdp; + char buf[PREFIX_STRLEN]; + u_int32_t dst; + u_int32_t ttl = 1; + + if (!(ifp->flags & IFF_UP)) + return; + + if (irdp->flags & IF_BROADCAST) + dst = INADDR_BROADCAST; + else + dst = htonl(INADDR_ALLHOSTS_GROUP); + + if (irdp->flags & IF_DEBUG_MESSAGES) + zlog_debug("IRDP: TX Advert on %s %s Holdtime=%d Preference=%d", + ifp->name, prefix2str(p, buf, sizeof buf), + irdp->flags & IF_SHUTDOWN ? 0 : irdp->Lifetime, + get_pref(irdp, p)); + + send_packet(ifp, s, dst, p, ttl); } -static void irdp_advertisement (struct interface *ifp, struct prefix *p) +static void irdp_advertisement(struct interface *ifp, struct prefix *p) { - struct stream *s; - s = stream_new (128); - make_advertisement_packet (ifp, p, s); - irdp_send(ifp, p, s); - stream_free (s); + struct stream *s; + s = stream_new(128); + make_advertisement_packet(ifp, p, s); + irdp_send(ifp, p, s); + stream_free(s); } int irdp_send_thread(struct thread *t_advert) { - u_int32_t timer, tmp; - struct interface *ifp = THREAD_ARG (t_advert); - struct zebra_if *zi=ifp->info; - struct irdp_interface *irdp=&zi->irdp; - struct prefix *p; - struct listnode *node, *nnode; - struct connected *ifc; - - irdp->flags &= ~IF_SOLICIT; - - if(ifp->connected) - for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, ifc)) - { - p = ifc->address; - - if (p->family != AF_INET) - continue; - - irdp_advertisement(ifp, p); - irdp->irdp_sent++; - } - - tmp = irdp->MaxAdvertInterval-irdp->MinAdvertInterval; - timer = random () % (tmp + 1); - timer = irdp->MinAdvertInterval + timer; - - if(irdp->irdp_sent < MAX_INITIAL_ADVERTISEMENTS && - timer > MAX_INITIAL_ADVERT_INTERVAL ) - timer= MAX_INITIAL_ADVERT_INTERVAL; - - if(irdp->flags & IF_DEBUG_MISC) - zlog_debug("IRDP: New timer for %s set to %u\n", ifp->name, timer); - - irdp->t_advertise = NULL; - thread_add_timer(zebrad.master, irdp_send_thread, ifp, timer, - &irdp->t_advertise); - return 0; + u_int32_t timer, tmp; + struct interface *ifp = THREAD_ARG(t_advert); + struct zebra_if *zi = ifp->info; + struct irdp_interface *irdp = &zi->irdp; + struct prefix *p; + struct listnode *node, *nnode; + struct connected *ifc; + + irdp->flags &= ~IF_SOLICIT; + + if (ifp->connected) + for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { + p = ifc->address; + + if (p->family != AF_INET) + continue; + + irdp_advertisement(ifp, p); + irdp->irdp_sent++; + } + + tmp = irdp->MaxAdvertInterval - irdp->MinAdvertInterval; + timer = random() % (tmp + 1); + timer = irdp->MinAdvertInterval + timer; + + if (irdp->irdp_sent < MAX_INITIAL_ADVERTISEMENTS + && timer > MAX_INITIAL_ADVERT_INTERVAL) + timer = MAX_INITIAL_ADVERT_INTERVAL; + + if (irdp->flags & IF_DEBUG_MISC) + zlog_debug("IRDP: New timer for %s set to %u\n", ifp->name, + timer); + + irdp->t_advertise = NULL; + thread_add_timer(zebrad.master, irdp_send_thread, ifp, timer, + &irdp->t_advertise); + return 0; } void irdp_advert_off(struct interface *ifp) { - struct zebra_if *zi=ifp->info; - struct irdp_interface *irdp=&zi->irdp; - struct listnode *node, *nnode; - int i; - struct connected *ifc; - struct prefix *p; - - if(irdp->t_advertise) thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; - - if(ifp->connected) - for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, ifc)) - { - p = ifc->address; - - /* Output some packets with Lifetime 0 - we should add a wait... - */ - - for(i=0; i< IRDP_LAST_ADVERT_MESSAGES; i++) - { - irdp->irdp_sent++; - irdp_advertisement(ifp, p); - } - } + struct zebra_if *zi = ifp->info; + struct irdp_interface *irdp = &zi->irdp; + struct listnode *node, *nnode; + int i; + struct connected *ifc; + struct prefix *p; + + if (irdp->t_advertise) + thread_cancel(irdp->t_advertise); + irdp->t_advertise = NULL; + + if (ifp->connected) + for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { + p = ifc->address; + + /* Output some packets with Lifetime 0 + we should add a wait... + */ + + for (i = 0; i < IRDP_LAST_ADVERT_MESSAGES; i++) { + irdp->irdp_sent++; + irdp_advertisement(ifp, p); + } + } } -void process_solicit (struct interface *ifp) +void process_solicit(struct interface *ifp) { - struct zebra_if *zi=ifp->info; - struct irdp_interface *irdp=&zi->irdp; - u_int32_t timer; + struct zebra_if *zi = ifp->info; + struct irdp_interface *irdp = &zi->irdp; + u_int32_t timer; - /* When SOLICIT is active we reject further incoming solicits - this keeps down the answering rate so we don't have think - about DoS attacks here. */ + /* When SOLICIT is active we reject further incoming solicits + this keeps down the answering rate so we don't have think + about DoS attacks here. */ - if( irdp->flags & IF_SOLICIT) return; + if (irdp->flags & IF_SOLICIT) + return; - irdp->flags |= IF_SOLICIT; - if(irdp->t_advertise) thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; + irdp->flags |= IF_SOLICIT; + if (irdp->t_advertise) + thread_cancel(irdp->t_advertise); + irdp->t_advertise = NULL; - timer = (random () % MAX_RESPONSE_DELAY) + 1; + timer = (random() % MAX_RESPONSE_DELAY) + 1; - irdp->t_advertise = NULL; - thread_add_timer(zebrad.master, irdp_send_thread, ifp, timer, - &irdp->t_advertise); + irdp->t_advertise = NULL; + thread_add_timer(zebrad.master, irdp_send_thread, ifp, timer, + &irdp->t_advertise); } void irdp_finish() { - struct vrf *vrf; - struct listnode *node, *nnode; - struct interface *ifp; - struct zebra_if *zi; - struct irdp_interface *irdp; - - zlog_info("IRDP: Received shutdown notification."); - - RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) - for (ALL_LIST_ELEMENTS (vrf->iflist, node, nnode, ifp)) - { - zi = ifp->info; - - if (!zi) - continue; - irdp = &zi->irdp; - if (!irdp) - continue; - - if (irdp->flags & IF_ACTIVE ) - { - irdp->flags |= IF_SHUTDOWN; - irdp_advert_off(ifp); - } - } + struct vrf *vrf; + struct listnode *node, *nnode; + struct interface *ifp; + struct zebra_if *zi; + struct irdp_interface *irdp; + + zlog_info("IRDP: Received shutdown notification."); + + RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) + for (ALL_LIST_ELEMENTS(vrf->iflist, node, nnode, ifp)) { + zi = ifp->info; + + if (!zi) + continue; + irdp = &zi->irdp; + if (!irdp) + continue; + + if (irdp->flags & IF_ACTIVE) { + irdp->flags |= IF_SHUTDOWN; + irdp_advert_off(ifp); + } + } } #endif /* HAVE_IRDP */ |