#ifdef HAVE_SCRIPTING
#include <lua.h>
+#include <nexthop.h>
+#include <nexthop_group.h>
#include "frrlua.h"
#include "bgpd/bgp_script.h" // for peer and attr encoders/decoders
extern "C" {
#endif
+/* Forward declarations */
+extern struct zebra_dplane_ctx ctx;
+extern void lua_pushzebra_dplane_ctx(lua_State *L,
+ const struct zebra_dplane_ctx *ctx);
+extern void lua_decode_zebra_dplane_ctx(lua_State *L, int idx,
+ struct zebra_dplane_ctx *ctx);
+
+/*
+ * Script name hash
+ */
+PREDECL_HASH(frrscript_names);
+
+struct frrscript_names_entry {
+ /* Name of a Lua hook call */
+ char function_name[MAXPATHLEN];
+
+ /* Lua script in which to look for it */
+ char script_name[MAXPATHLEN];
+
+ struct frrscript_names_item item;
+};
+
+extern struct frrscript_names_head frrscript_names_hash;
+
+int frrscript_names_hash_cmp(const struct frrscript_names_entry *snhe1,
+ const struct frrscript_names_entry *snhe2);
+uint32_t frrscript_names_hash_key(const struct frrscript_names_entry *snhe);
+
+DECLARE_HASH(frrscript_names, struct frrscript_names_entry, item,
+ frrscript_names_hash_cmp, frrscript_names_hash_key);
+
+int frrscript_names_add_function_name(const char *function_name);
+void frrscript_names_destroy(void);
+int frrscript_names_set_script_name(const char *function_name,
+ const char *script_name);
+char *frrscript_names_get_script_name(const char *function_name);
+
typedef void (*encoder_func)(lua_State *, const void *);
typedef void *(*decoder_func)(lua_State *, int);
char * : lua_pushstring_wrapper, \
struct attr * : lua_pushattr, \
struct peer * : lua_pushpeer, \
-const struct prefix * : lua_pushprefix \
+const struct prefix * : lua_pushprefix, \
+const struct ipaddr * : lua_pushipaddr, \
+const struct ethaddr * : lua_pushethaddr, \
+const struct nexthop_group * : lua_pushnexthop_group, \
+const struct nexthop * : lua_pushnexthop, \
+struct zebra_dplane_ctx * : lua_pushzebra_dplane_ctx \
)((L), (value))
#define DECODE_ARGS_WITH_STATE(L, value) \
char * : lua_decode_stringp, \
struct attr * : lua_decode_attr, \
struct peer * : lua_decode_noop, \
-const struct prefix * : lua_decode_noop \
+const struct prefix * : lua_decode_noop, \
+const struct ipaddr * : lua_decode_noop, \
+const struct ethaddr * : lua_decode_noop, \
+const struct nexthop_group * : lua_decode_noop, \
+const struct nexthop * : lua_decode_noop, \
+struct zebra_dplane_ctx * : lua_decode_noop \
)((L), -1, (value))
/*
int _frrscript_call_lua(struct lua_function_state *lfs, int nargs);
/*
- * Wrapper for calling Lua function state. Maps values passed in to their
- * encoder and decoder types.
+ * Wrapper for calling Lua function state.
+ *
+ * The Lua function name (f) to run should have already been checked by
+ * frrscript_load. So this wrapper will:
+ * 1) Find the Lua function state, which contains the Lua state
+ * 2) Clear the Lua state (there may be leftovers items from previous call)
+ * 3) Push the Lua function (f)
+ * 4) Map frrscript_call arguments onto their encoder and decoders, push those
+ * 5) Call _frrscript_call_lua (Lua execution takes place)
+ * 6) Write back to frrscript_call arguments using their decoders
+ *
+ * This wrapper can be called multiple times (after one frrscript_load).
*
* fs
* The struct frrscript in which the Lua fuction was loaded into
1; \
}) \
: ({ \
+ lua_settop(lfs->L, 0); \
+ lua_getglobal(lfs->L, f); \
MAP_LISTS(ENCODE_ARGS, ##__VA_ARGS__); \
_frrscript_call_lua( \
lfs, PP_NARG(__VA_ARGS__)); \