typedef struct endpoint endpoint_t; // place holder for structs defined in nano/nng private.h
typedef struct uta_ctx uta_ctx_t;
typedef struct endpoint endpoint_t; // place holder for structs defined in nano/nng private.h
typedef struct uta_ctx uta_ctx_t;
#define ENV_RTG_PORT "RMR_RTG_SVC" // the port we'll listen on for rtg connections (deprecated; see RTG_SVC and CTL_PORT)
#define ENV_RTG_ADDR "RMR_RTG_SVC" // the address we will connect to for route manager updates
#define ENV_SEED_RT "RMR_SEED_RT" // where we expect to find the name of the seed route table
#define ENV_RTG_PORT "RMR_RTG_SVC" // the port we'll listen on for rtg connections (deprecated; see RTG_SVC and CTL_PORT)
#define ENV_RTG_ADDR "RMR_RTG_SVC" // the address we will connect to for route manager updates
#define ENV_SEED_RT "RMR_SEED_RT" // where we expect to find the name of the seed route table
#define ENV_SEED_MEMAP "RMR_SEED_MEMAP" // where we expect to find the name of the seed route table
#define ENV_RTG_RAW "RMR_RTG_ISRAW" // if > 0 we expect route table gen messages as raw (not sent from an RMr application)
#define ENV_VERBOSE_FILE "RMR_VCTL_FILE" // file where vlevel may be managed for some (non-time critical) functions
#define ENV_SEED_MEMAP "RMR_SEED_MEMAP" // where we expect to find the name of the seed route table
#define ENV_RTG_RAW "RMR_RTG_ISRAW" // if > 0 we expect route table gen messages as raw (not sent from an RMr application)
#define ENV_VERBOSE_FILE "RMR_VCTL_FILE" // file where vlevel may be managed for some (non-time critical) functions
#define ENV_LOG_HR "RMR_HR_LOG" // set to 0 to turn off human readable logging and write using some formatting
#define ENV_LOG_VLEVEL "RMR_LOG_VLEVEL" // set the verbosity level (0 == 0ff; 1 == crit .... 5 == debug )
#define ENV_CTL_PORT "RMR_CTL_PORT" // route collector will listen here for control messages (4561 default)
#define ENV_LOG_HR "RMR_HR_LOG" // set to 0 to turn off human readable logging and write using some formatting
#define ENV_LOG_VLEVEL "RMR_LOG_VLEVEL" // set the verbosity level (0 == 0ff; 1 == crit .... 5 == debug )
#define ENV_CTL_PORT "RMR_CTL_PORT" // route collector will listen here for control messages (4561 default)
#define CFL_MTC_ENABLED 0x01 // multi-threaded call is enabled
#define CFL_NO_RTACK 0x02 // no route table ack needed when end received
#define CFL_MTC_ENABLED 0x01 // multi-threaded call is enabled
#define CFL_NO_RTACK 0x02 // no route table ack needed when end received
// msg buffer flags
#define MFL_ZEROCOPY 0x01 // the message is an allocated zero copy message and can be sent.
#define MFL_NOALLOC 0x02 // send should NOT allocate a new buffer before returning
#define MFL_ADDSRC 0x04 // source must be added on send
#define MFL_RAW 0x08 // message is 'raw' and not from an RMr based sender (no header)
// msg buffer flags
#define MFL_ZEROCOPY 0x01 // the message is an allocated zero copy message and can be sent.
#define MFL_NOALLOC 0x02 // send should NOT allocate a new buffer before returning
#define MFL_ADDSRC 0x04 // source must be added on send
#define MFL_RAW 0x08 // message is 'raw' and not from an RMr based sender (no header)
#define MAX_EP_GROUP 32 // max number of endpoints in a group
#define MAX_RTG_MSG_SZ 2048 // max expected message size from route generator
#define MAX_EP_GROUP 32 // max number of endpoints in a group
#define MAX_RTG_MSG_SZ 2048 // max expected message size from route generator
#define DEF_COMM_PORT "tcp:4560" // default port we use for normal communications
#define DEF_RTG_WK_ADDR "routemgr:4561" // well known address for the route manager
#define DEF_TR_LEN (-1) // use default trace data len from context
#define DEF_COMM_PORT "tcp:4560" // default port we use for normal communications
#define DEF_RTG_WK_ADDR "routemgr:4561" // well known address for the route manager
#define DEF_TR_LEN (-1) // use default trace data len from context
#define UNSET_SUBID (-1) // initial value on msg allocation indicating not set
#define UNSET_MSGTYPE (-1)
#define UNSET_SUBID (-1) // initial value on msg allocation indicating not set
#define UNSET_MSGTYPE (-1)
#define HFL_SUBID 0x02 // subscription ID is populated
#define HFL_CALL_MSG 0x04 // msg sent via blocking call
#define HFL_SUBID 0x02 // subscription ID is populated
#define HFL_CALL_MSG 0x04 // msg sent via blocking call
+/*
+ Alarm action constants describe the type (e.g. dropping messages) and whether or not
+ this is a "raise" or "clear" action. Raise/clear is determined by the least significant
+ bit; 1 == raise.
+*/
+#define ALARM_RAISE 0x01
+#define ALARM_CLEAR 0x00
+#define ALARM_KIND(a) (a&ALARM_MASK)
+#define ALARM_DROPS 0x02
+#define ALARM_MASK 0xfffe
+
int updates; // counter of update records received
int mupdates; // counter of meid update records received
int updates; // counter of update records received
int mupdates; // counter of meid update records received
#define RING_NONE 0 // no options
#define RING_RLOCK 0x01 // create/destroy the read lock on the ring
#define RING_WLOCK 0x02 // create/destroy the write lockk on the ring
#define RING_NONE 0 // no options
#define RING_RLOCK 0x01 // create/destroy the read lock on the ring
#define RING_WLOCK 0x02 // create/destroy the write lockk on the ring
uint16_t nelements; // number of elements in the ring
void** data; // the ring data (pointers to blobs of stuff)
int pfd; // event fd for the ring for epoll
uint16_t nelements; // number of elements in the ring
void** data; // the ring data (pointers to blobs of stuff)
int pfd; // event fd for the ring for epoll
static int uta_tokenise( char* buf, char** tokens, int max, char sep );
static int uta_rmip_tokenise( char* buf, if_addrs_t* iplist, char** toks, int max, char sep );
static char* uta_h2ip( char const* hname );
static int uta_tokenise( char* buf, char** tokens, int max, char sep );
static int uta_rmip_tokenise( char* buf, if_addrs_t* iplist, char** toks, int max, char sep );
static char* uta_h2ip( char const* hname );
static int uta_has_str( char const* buf, char const* str, char sep, int max );
static char* get_default_ip( if_addrs_t* iplist );
static int uta_has_str( char const* buf, char const* str, char sep, int max );
static char* get_default_ip( if_addrs_t* iplist );
+// --- internal alarm generation ---------------------
+static void uta_alarm( void* vctx, int kind, int prob_id, char* info );
+static void uta_alarm_send( void* vctx, rmr_mbuf_t* msg );
+
// ----- route table generic static things ---------
static inline uint64_t build_rt_key( int32_t sub_id, int32_t mtype );
static void collect_things( void* st, void* entry, char const* name, void* thing, void* vthing_list );
static void del_rte( void* st, void* entry, char const* name, void* thing, void* data );
// ----- route table generic static things ---------
static inline uint64_t build_rt_key( int32_t sub_id, int32_t mtype );
static void collect_things( void* st, void* entry, char const* name, void* thing, void* vthing_list );
static void del_rte( void* st, void* entry, char const* name, void* thing, void* data );
-static endpoint_t* get_meid_owner( route_table_t *rt, char* meid );
-static char* uta_fib( char* fname );
-static route_table_t* uta_rt_init( );
-static route_table_t* uta_rt_clone( route_table_t* srt );
-static route_table_t* uta_rt_clone_all( route_table_t* srt );
+static endpoint_t* get_meid_owner( route_table_t *rt, char const* meid );
+static char* uta_fib( char const* fname );
+static route_table_t* uta_rt_init( uta_ctx_t* ctx );
+static route_table_t* uta_rt_clone( uta_ctx_t* ctx, route_table_t* srt, route_table_t* drt, int all );
static endpoint_t* uta_add_ep( route_table_t* rt, rtable_ent_t* rte, char* ep_name, int group );
static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups );
static endpoint_t* uta_get_ep( route_table_t* rt, char const* ep_name );
static void read_static_rt( uta_ctx_t* ctx, int vlevel );
static endpoint_t* uta_add_ep( route_table_t* rt, rtable_ent_t* rte, char* ep_name, int group );
static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups );
static endpoint_t* uta_get_ep( route_table_t* rt, char const* ep_name );
static void read_static_rt( uta_ctx_t* ctx, int vlevel );
-static void parse_rt_rec( uta_ctx_t* ctx, uta_ctx_t* pctx, char* buf, int vlevel );
+static route_table_t* prep_new_rt( uta_ctx_t* ctx, int all );
+static void parse_rt_rec( uta_ctx_t* ctx, uta_ctx_t* pctx, char* buf, int vlevel, rmr_mbuf_t* mbuf );
static void* rtc( void* vctx );
static endpoint_t* rt_ensure_ep( route_table_t* rt, char const* ep_name );
// --------- route manager communications -----------------
static void* rtc( void* vctx );
static endpoint_t* rt_ensure_ep( route_table_t* rt, char const* ep_name );
// --------- route manager communications -----------------
-static void send_rt_ack( uta_ctx_t* ctx, char* table_id, int state, char* reason );
+static void send_rt_ack( uta_ctx_t* ctx, rmr_mbuf_t* mbuf, char* table_id, int state, char* reason );