From 65de8bc8d0d949f0ea12a84dba9b7963ac1a74f6 Mon Sep 17 00:00:00 2001 From: vdhingra Date: Fri, 5 Jun 2020 00:10:41 -0700 Subject: [PATCH] lib: Add support to load submodules in embedded modules framework BGP Yang is using sub modules and at present FRR is not processing submodules in embedded framework yang Signed-off-by: VishalDhingra --- lib/yang.c | 28 ++++++++++++++++++---------- lib/yang.h | 2 ++ yang/embedmodel.py | 21 ++++++++++++++++++--- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/lib/yang.c b/lib/yang.c index 0714ddf7bb..bd749d1f3d 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -53,22 +53,30 @@ static const char *yang_module_imp_clb(const char *mod_name, { struct yang_module_embed *e; - if (submod_name || submod_rev) - return NULL; - for (e = embeds; e; e = e->next) { - if (strcmp(e->mod_name, mod_name)) - continue; - if (mod_rev && strcmp(e->mod_rev, mod_rev)) - continue; + if (e->sub_mod_name && submod_name) { + if (strcmp(e->sub_mod_name, submod_name)) + continue; + + if (submod_rev && strcmp(e->sub_mod_rev, submod_rev)) + continue; + } else { + if (strcmp(e->mod_name, mod_name)) + continue; + + if (mod_rev && strcmp(e->mod_rev, mod_rev)) + continue; + } *format = e->format; return e->data; } - flog_warn(EC_LIB_YANG_MODULE_LOAD, - "YANG model \"%s@%s\" not embedded, trying external file", - mod_name, mod_rev ? mod_rev : "*"); + flog_warn( + EC_LIB_YANG_MODULE_LOAD, + "YANG model \"%s@%s\" \"%s@%s\"not embedded, trying external file", + mod_name, mod_rev ? mod_rev : "*", + submod_name ? submod_name : "*", submod_rev ? submod_rev : "*"); return NULL; } diff --git a/lib/yang.h b/lib/yang.h index 85ef0d758c..b9b2e90d27 100644 --- a/lib/yang.h +++ b/lib/yang.h @@ -48,6 +48,8 @@ extern "C" { struct yang_module_embed { struct yang_module_embed *next; const char *mod_name, *mod_rev; + const char *sub_mod_name; + const char *sub_mod_rev; const char *data; LYS_INFORMAT format; }; diff --git a/yang/embedmodel.py b/yang/embedmodel.py index 624a11da9d..0a25c93da7 100644 --- a/yang/embedmodel.py +++ b/yang/embedmodel.py @@ -20,6 +20,8 @@ if not os.path.isdir(outdir): # to make it even harder. re_name = re.compile(r'\bmodule\s+([^\s]+)\s+\{') +re_subname = re.compile(r'\bsubmodule\s+([^\s]+)\s+\{') +re_mainname = re.compile(r'\bbelongs-to\s+([^\s]+)\s+\{') re_rev = re.compile(r'\brevision\s+([\d-]+)\s+\{') @@ -34,6 +36,8 @@ static const char model[] = static struct yang_module_embed embed = { \t.mod_name = "%s", \t.mod_rev = "%s", +\t.sub_mod_name = "%s", +\t.sub_mod_rev = "%s", \t.data = model, \t.format = %s, }; @@ -62,6 +66,10 @@ def escape(line): with open(inname, 'r') as fd: data = fd.read() +sub_name = "" +rev = "" +sub_rev = "" + # XML support isn't actively used currently, but it's here in case the need # arises. It does avoid the regex'ing. if '