From e80e7cced350874ce25342d032cd8a08f9fdb1c8 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Tue, 27 Sep 2016 14:51:08 +0200 Subject: [PATCH] lib: qobj: register ifaces, routemaps & keychains This places the appropriate calls so library objects can be used with qobj "pointers", especially in the CLI. Signed-off-by: David Lamparter --- lib/if.c | 6 ++++++ lib/if.h | 4 ++++ lib/keychain.c | 14 ++++++++++++-- lib/keychain.h | 8 ++++++++ lib/routemap.c | 9 +++++++++ lib/routemap.h | 7 +++++++ lib/vrf.c | 6 ++++++ lib/vrf.h | 4 ++++ 8 files changed, 56 insertions(+), 2 deletions(-) diff --git a/lib/if.c b/lib/if.c index bd6079c0f..2add03d67 100644 --- a/lib/if.c +++ b/lib/if.c @@ -43,6 +43,8 @@ DEFINE_MTYPE_STATIC(LIB, NBR_CONNECTED, "Neighbor Connected") DEFINE_MTYPE( LIB, CONNECTED_LABEL, "Connected interface label") DEFINE_MTYPE_STATIC(LIB, IF_LINK_PARAMS, "Informational Link Parameters") +DEFINE_QOBJ_TYPE(interface) + /* List of interfaces in only the default VRF */ int ptm_enable = 0; @@ -149,6 +151,8 @@ if_create_vrf (const char *name, int namelen, vrf_id_t vrf_id) /* Enable Link-detection by default */ SET_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION); + QOBJ_REG (ifp, interface); + if (if_master.if_new_hook) (*if_master.if_new_hook) (ifp); @@ -193,6 +197,8 @@ if_delete_retain (struct interface *ifp) if (if_master.if_delete_hook) (*if_master.if_delete_hook) (ifp); + QOBJ_UNREG (ifp); + /* Free connected address list */ list_delete_all_node (ifp->connected); diff --git a/lib/if.h b/lib/if.h index d1875e695..57062cd3f 100644 --- a/lib/if.h +++ b/lib/if.h @@ -24,6 +24,7 @@ Boston, MA 02111-1307, USA. */ #include "zebra.h" #include "linklist.h" #include "memory.h" +#include "qobj.h" DECLARE_MTYPE(IF) DECLARE_MTYPE(CONNECTED_LABEL) @@ -267,7 +268,10 @@ struct interface struct route_node *node; vrf_id_t vrf_id; + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(interface) /* Connected address structure. */ struct connected diff --git a/lib/keychain.c b/lib/keychain.c index ac2083cf4..85af482e1 100644 --- a/lib/keychain.c +++ b/lib/keychain.c @@ -28,30 +28,40 @@ Boston, MA 02111-1307, USA. */ DEFINE_MTYPE_STATIC(LIB, KEY, "Key") DEFINE_MTYPE_STATIC(LIB, KEYCHAIN, "Key chain") +DEFINE_QOBJ_TYPE(keychain) +DEFINE_QOBJ_TYPE(key) + /* Master list of key chain. */ struct list *keychain_list; static struct keychain * keychain_new (void) { - return XCALLOC (MTYPE_KEYCHAIN, sizeof (struct keychain)); + struct keychain *keychain; + keychain = XCALLOC (MTYPE_KEYCHAIN, sizeof (struct keychain)); + QOBJ_REG (keychain, keychain); + return keychain; } static void keychain_free (struct keychain *keychain) { + QOBJ_UNREG (keychain); XFREE (MTYPE_KEYCHAIN, keychain); } static struct key * key_new (void) { - return XCALLOC (MTYPE_KEY, sizeof (struct key)); + struct key *key = XCALLOC (MTYPE_KEY, sizeof (struct key)); + QOBJ_REG (key, key); + return key; } static void key_free (struct key *key) { + QOBJ_UNREG (key); XFREE (MTYPE_KEY, key); } diff --git a/lib/keychain.h b/lib/keychain.h index f962864c5..d3f9168a0 100644 --- a/lib/keychain.h +++ b/lib/keychain.h @@ -22,12 +22,17 @@ #ifndef _ZEBRA_KEYCHAIN_H #define _ZEBRA_KEYCHAIN_H +#include "qobj.h" + struct keychain { char *name; struct list *key; + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(keychain) struct key_range { @@ -45,7 +50,10 @@ struct key struct key_range send; struct key_range accept; + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(key) extern void keychain_init (void); extern struct keychain *keychain_lookup (const char *); diff --git a/lib/routemap.c b/lib/routemap.c index 09afc31bc..d1fa14fc3 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -38,6 +38,9 @@ DEFINE_MTYPE_STATIC(LIB, ROUTE_MAP_RULE_STR, "Route map rule str") DEFINE_MTYPE( LIB, ROUTE_MAP_COMPILED, "Route map compiled") DEFINE_MTYPE_STATIC(LIB, ROUTE_MAP_DEP, "Route map dependency") +DEFINE_QOBJ_TYPE(route_map_index) +DEFINE_QOBJ_TYPE(route_map) + /* Vector for route match rules. */ static vector route_match_vec; @@ -155,6 +158,7 @@ route_map_new (const char *name) new = XCALLOC (MTYPE_ROUTE_MAP, sizeof (struct route_map)); new->name = XSTRDUP (MTYPE_ROUTE_MAP_NAME, name); + QOBJ_REG (new, route_map); return new; } @@ -215,6 +219,8 @@ route_map_free_map (struct route_map *map) if (map != NULL) { + QOBJ_UNREG (map); + if (map->next) map->next->prev = map->prev; else @@ -482,6 +488,7 @@ route_map_index_new (void) new = XCALLOC (MTYPE_ROUTE_MAP_INDEX, sizeof (struct route_map_index)); new->exitpolicy = RMAP_EXIT; /* Default to Cisco-style */ + QOBJ_REG (new, route_map_index); return new; } @@ -491,6 +498,8 @@ route_map_index_delete (struct route_map_index *index, int notify) { struct route_map_rule *rule; + QOBJ_UNREG (index); + /* Free route match. */ while ((rule = index->match_list.head) != NULL) route_map_rule_delete (&index->match_list, rule); diff --git a/lib/routemap.h b/lib/routemap.h index 7006e43f6..427a552e7 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -24,6 +24,7 @@ #include "prefix.h" #include "memory.h" +#include "qobj.h" DECLARE_MTYPE(ROUTE_MAP_NAME) DECLARE_MTYPE(ROUTE_MAP_RULE) DECLARE_MTYPE(ROUTE_MAP_COMPILED) @@ -152,7 +153,10 @@ struct route_map_index /* Make linked list. */ struct route_map_index *next; struct route_map_index *prev; + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(route_map_index) /* Route map list structure. */ struct route_map @@ -171,7 +175,10 @@ struct route_map /* Maintain update info */ int to_be_processed; /* True if modification isn't acted on yet */ int deleted; /* If 1, then this node will be deleted */ + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(route_map) /* Prototypes. */ extern void route_map_init (void); diff --git a/lib/vrf.c b/lib/vrf.c index 7d79b3dc9..63adea4ae 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -33,6 +33,8 @@ DEFINE_MTYPE_STATIC(LIB, VRF, "VRF") DEFINE_MTYPE_STATIC(LIB, VRF_BITMAP, "VRF bit-map") +DEFINE_QOBJ_TYPE(vrf) + /* * Turn on/off debug code * for vrf. @@ -124,6 +126,7 @@ vrf_get (vrf_id_t vrf_id, const char *name) strcpy (vrf->name, name); listnode_add_sort (vrf_list, vrf); if_init (&vrf->iflist); + QOBJ_REG (vrf, vrf); if (vrf_master.vrf_new_hook) { (*vrf_master.vrf_new_hook) (vrf_id, name, &vrf->info); @@ -212,6 +215,7 @@ vrf_get (vrf_id_t vrf_id, const char *name) strcpy (vrf->name, name); listnode_add_sort (vrf_list, vrf); if_init (&vrf->iflist); + QOBJ_REG (vrf, vrf); if (vrf_master.vrf_new_hook) { (*vrf_master.vrf_new_hook) (vrf_id, name, &vrf->info); @@ -249,6 +253,7 @@ vrf_get (vrf_id_t vrf_id, const char *name) vrf->node = rn; vrf->vrf_id = vrf_id; if_init (&vrf->iflist); + QOBJ_REG (vrf, vrf); if (debug_vrf) zlog_debug("Vrf Created: %p", vrf); return vrf; @@ -275,6 +280,7 @@ vrf_delete (struct vrf *vrf) if (vrf_master.vrf_delete_hook) (*vrf_master.vrf_delete_hook) (vrf->vrf_id, vrf->name, &vrf->info); + QOBJ_UNREG (vrf); if_terminate (&vrf->iflist); if (vrf->node) diff --git a/lib/vrf.h b/lib/vrf.h index dcc115563..127b7082e 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -24,6 +24,7 @@ #define _ZEBRA_VRF_H #include "linklist.h" +#include "qobj.h" /* The default NS ID */ #define NS_DEFAULT 0 @@ -85,7 +86,10 @@ struct vrf /* User data */ void *info; + + QOBJ_FIELDS }; +DECLARE_QOBJ_TYPE(vrf) extern struct list *vrf_list; -- 2.39.2