summaryrefslogtreecommitdiff
path: root/zebra/irdp_main.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2017-08-06 08:57:42 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2017-08-15 13:26:03 +0200
commitead4ee99acd63d2342e9e9dda7a8f5a103a6f550 (patch)
tree876fee1047023d8571c9a75af9cc371c738e4e75 /zebra/irdp_main.c
parent2eb27eecf011a06c01e58a735d8bf087d7519979 (diff)
zebra: irdp: manage separate IRDP struct
This allocates the per-interface IRDP data as needed; so the pointer in zebra_if is now really opaque. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'zebra/irdp_main.c')
-rw-r--r--zebra/irdp_main.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c
index e463608af1..73c6d8141a 100644
--- a/zebra/irdp_main.c
+++ b/zebra/irdp_main.c
@@ -52,6 +52,7 @@
#include "zclient.h"
#include "thread.h"
#include "privs.h"
+#include "libfrr.h"
#include "zebra/interface.h"
#include "zebra/rtadv.h"
#include "zebra/rib.h"
@@ -143,7 +144,7 @@ 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;
+ struct irdp_interface *irdp = zi->irdp;
int size;
int pref;
u_int16_t checksum;
@@ -175,11 +176,13 @@ static int make_advertisement_packet(struct interface *ifp, struct prefix *p,
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;
+ struct irdp_interface *irdp = zi->irdp;
char buf[PREFIX_STRLEN];
u_int32_t dst;
u_int32_t ttl = 1;
+ if (!irdp)
+ return;
if (!(ifp->flags & IFF_UP))
return;
@@ -211,11 +214,14 @@ 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 irdp_interface *irdp = zi->irdp;
struct prefix *p;
struct listnode *node, *nnode;
struct connected *ifc;
+ if (!irdp)
+ return 0;
+
irdp->flags &= ~IF_SOLICIT;
if (ifp->connected)
@@ -250,12 +256,15 @@ int irdp_send_thread(struct thread *t_advert)
void irdp_advert_off(struct interface *ifp)
{
struct zebra_if *zi = ifp->info;
- struct irdp_interface *irdp = &zi->irdp;
+ struct irdp_interface *irdp = zi->irdp;
struct listnode *node, *nnode;
int i;
struct connected *ifc;
struct prefix *p;
+ if (!irdp)
+ return;
+
if (irdp->t_advertise)
thread_cancel(irdp->t_advertise);
irdp->t_advertise = NULL;
@@ -279,9 +288,12 @@ void irdp_advert_off(struct interface *ifp)
void process_solicit(struct interface *ifp)
{
struct zebra_if *zi = ifp->info;
- struct irdp_interface *irdp = &zi->irdp;
+ struct irdp_interface *irdp = zi->irdp;
u_int32_t timer;
+ if (!irdp)
+ return;
+
/* 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. */
@@ -317,7 +329,7 @@ static int irdp_finish(void)
if (!zi)
continue;
- irdp = &zi->irdp;
+ irdp = zi->irdp;
if (!irdp)
continue;
@@ -326,6 +338,7 @@ static int irdp_finish(void)
irdp_advert_off(ifp);
}
}
+ return 0;
}
void irdp_init(void)