diff options
author | Matthieu Boutier <boutier@pps.jussieu.fr> | 2012-01-28 00:29:51 +0100 |
---|---|---|
committer | Paul Jakma <paul@quagga.net> | 2012-03-25 17:06:53 +0100 |
commit | 8c4e57a57562c9329b1de4c29ee921ab98182c6b (patch) | |
tree | 54253839ace41b14e363b6c5ede863c34e91e2e6 /babeld | |
parent | 69394543597a0fd8c161c5c8a0d25c8b1cfa8a93 (diff) |
babeld: fix interface bug, simplify code.
Perhaps could it be able to free already free memory (so free(NULL)),
in function interface_reset(). On other hand, it initiated untracked
interfaces, raising (at least) inappropriate messages. Finally, I
remove the BABEL_IF_IS_ENABLE flag, witch was not really usefull.
Note the test if_up isn't weaker, because (...IS_UP => ...IS_ENABLE).
Diffstat (limited to 'babeld')
-rw-r--r-- | babeld/babel_interface.c | 41 | ||||
-rw-r--r-- | babeld/babel_interface.h | 5 |
2 files changed, 30 insertions, 16 deletions
diff --git a/babeld/babel_interface.c b/babeld/babel_interface.c index 1c8c8868..fafe009f 100644 --- a/babeld/babel_interface.c +++ b/babeld/babel_interface.c @@ -57,6 +57,8 @@ THE SOFTWARE. #include "xroute.h" +#define IS_ENABLE(ifp) (babel_enable_if_lookup(ifp->name) >= 0) + static int babel_enable_if_lookup (const char *ifname); static int babel_enable_if_add (const char *ifname); static int babel_enable_if_delete (const char *ifname); @@ -87,7 +89,7 @@ babel_interface_up (int cmd, struct zclient *client, zebra_size_t length) debugf(BABEL_DEBUG_IF, "receive a 'interface up'"); s = zclient->ibuf; - ifp = zebra_interface_state_read(s); + ifp = zebra_interface_state_read(s); /* it updates iflist */ if (ifp == NULL) { return 0; @@ -106,7 +108,7 @@ babel_interface_down (int cmd, struct zclient *client, zebra_size_t length) debugf(BABEL_DEBUG_IF, "receive a 'interface down'"); s = zclient->ibuf; - ifp = zebra_interface_state_read(s); + ifp = zebra_interface_state_read(s); /* it updates iflist */ if (ifp == NULL) { return 0; @@ -131,14 +133,30 @@ babel_interface_add (int cmd, struct zclient *client, zebra_size_t length) } interface_recalculate(ifp); - return 0; } int babel_interface_delete (int cmd, struct zclient *client, zebra_size_t length) { + struct interface *ifp; + struct stream *s; + debugf(BABEL_DEBUG_IF, "receive a 'interface delete'"); + + s = zclient->ibuf; + ifp = zebra_interface_state_read(s); /* it updates iflist */ + + if (ifp == NULL) + return 0; + + if (IS_ENABLE(ifp)) + interface_reset(ifp); + + /* To support pseudo interface do not free interface structure. */ + /* if_delete(ifp); */ + ifp->ifindex = IFINDEX_INTERNAL; + return 0; } @@ -242,7 +260,7 @@ babel_enable_if_add (const char *ifname) ifp = if_lookup_by_name(ifname); if (ifp != NULL) - babel_get_if_nfo(ifp)->flags |= BABEL_IF_IS_ENABLE; + interface_recalculate(ifp); return 1; } @@ -265,7 +283,7 @@ babel_enable_if_delete (const char *ifname) ifp = if_lookup_by_name(ifname); if (ifp != NULL) - babel_get_if_nfo(ifp)->flags &= ~BABEL_IF_IS_ENABLE; + interface_reset(ifp); return 1; } @@ -514,6 +532,9 @@ interface_recalculate(struct interface *ifp) int mtu, rc; struct ipv6_mreq mreq; + if (!IS_ENABLE(ifp)) + return -1; + if (!if_is_operative(ifp) || !CHECK_FLAG(ifp->flags, IFF_RUNNING)) { interface_reset(ifp); return -1; @@ -594,13 +615,6 @@ interface_recalculate(struct interface *ifp) if(rc > 0) send_update(ifp, 0, NULL, 0); - /* Check and set if interface is enable. */ - if (babel_enable_if_lookup(ifp->name) >= 0) { - babel_ifp->flags |= BABEL_IF_IS_ENABLE; - } else { - babel_ifp->flags &= ~BABEL_IF_IS_ENABLE; - } - return 1; } @@ -613,6 +627,9 @@ interface_reset(struct interface *ifp) struct ipv6_mreq mreq; babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp); + if (!(babel_ifp->flags & BABEL_IF_IS_UP)) + return 0; + debugf(BABEL_DEBUG_IF, "interface reset: %s", ifp->name); babel_ifp->flags &= ~BABEL_IF_IS_UP; diff --git a/babeld/babel_interface.h b/babeld/babel_interface.h index 5b551fbe..ec69bff4 100644 --- a/babeld/babel_interface.h +++ b/babeld/babel_interface.h @@ -99,7 +99,6 @@ static inline babel_interface_nfo* babel_get_if_nfo(struct interface *ifp) #define BABEL_IF_SPLIT_HORIZON (1 << 2) #define BABEL_IF_LQ (1 << 3) #define BABEL_IF_FARAWAY (1 << 4) -#define BABEL_IF_IS_ENABLE (1 << 7) /* Only INTERFERING can appear on the wire. */ #define BABEL_IF_CHANNEL_UNKNOWN 0 @@ -111,9 +110,7 @@ if_up(struct interface *ifp) { return (if_is_operative(ifp) && ifp->connected != NULL && - babel_get_if_nfo(ifp) != NULL && - (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_UP) && - (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_ENABLE)); + (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_UP)); } /* types: |