Skip to content

Commit

Permalink
rtpengine: Check set uniqueness for rtpp node
Browse files Browse the repository at this point in the history
If node already found in set, update details like weight, recheck_ticks,
disabled status. Else, create new node for the specific set.
This is especially useful when reloading the nodes from database via
'kamctl fifo nh_rtpp_reload'; just to update the nodes,no shm_free and realloc
needed. Also applicable for the config file nodes.

This per set uniqueness of the nodes is plausible given the possibility to
set the weight of the rtpp nodes.
  • Loading branch information
Stefan Mititelu committed Dec 10, 2015
1 parent d884698 commit 0def328
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 4 deletions.
43 changes: 39 additions & 4 deletions modules/rtpengine/rtpengine.c
Expand Up @@ -204,7 +204,7 @@ static char *send_rtpp_command(struct rtpp_node *, bencode_item_t *, int *);
static int get_extra_id(struct sip_msg* msg, str *id_str);

static int rtpengine_set_store(modparam_t type, void * val);
static int rtpengine_add_rtpengine_set( char * rtp_proxies);
static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks);

static int mod_init(void);
static int child_init(int);
Expand Down Expand Up @@ -521,6 +521,9 @@ static int bind_force_send_ip(int sock_idx)
return 0;
}

static inline int str_cmp(const str *a , const str *b) {
return ! (a->len == b->len && ! strncmp(a->s, b->s, a->len));
}

static inline int str_eq(const str *p, const char *q) {
int l = strlen(q);
Expand All @@ -530,6 +533,7 @@ static inline int str_eq(const str *p, const char *q) {
return 0;
return 1;
}

static inline str str_prefix(const str *p, const char *q) {
str ret;
ret.s = NULL;
Expand Down Expand Up @@ -587,6 +591,25 @@ static int rtpengine_set_store(modparam_t type, void * val){
return 0;
}

struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url)
{
struct rtpp_node *rtpp_node;

if (rtpp_list == NULL) {
return NULL;
}

rtpp_node = rtpp_list->rn_first;
while (rtpp_node) {
if (str_cmp(&rtpp_node->rn_url, url) == 0) {
return rtpp_node;
}
rtpp_node = rtpp_node->rn_next;
}

return NULL;
}

struct rtpp_set *get_rtpp_set(int set_id)
{
struct rtpp_set * rtpp_list;
Expand Down Expand Up @@ -659,6 +682,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
/* Make rtp proxies list. */
char *p, *p1, *p2, *plim;
struct rtpp_node *pnode;
struct rtpp_node *rtpp_node;
int weight;

p = rtpproxy;
Expand Down Expand Up @@ -720,6 +744,16 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
pnode->rn_address += 5;
}

// if node found in set, update it for disabled state
rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url);
if (rtpp_node) {
rtpp_node->rn_disabled = pnode->rn_disabled;
rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks;
rtpp_node->rn_weight = pnode->rn_weight;
shm_free(pnode);
continue;
}

if (rtpp_list->rn_first == NULL) {
rtpp_list->rn_first = pnode;
} else {
Expand All @@ -736,7 +770,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
/* 0-succes
* -1 - erorr
* */
static int rtpengine_add_rtpengine_set( char * rtp_proxies)
static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks)
{
char *p,*p2;
struct rtpp_set * rtpp_list;
Expand Down Expand Up @@ -789,7 +823,8 @@ static int rtpengine_add_rtpengine_set( char * rtp_proxies)

if (rtpp_list != NULL)
{
if (add_rtpengine_socks(rtpp_list, rtp_proxies, 0, 0) != 0)

if (add_rtpengine_socks(rtpp_list, rtp_proxies, disabled, ticks) != 0)
goto error;
else
return 0;
Expand Down Expand Up @@ -1439,7 +1474,7 @@ mod_init(void)
{
/* storing the list of rtp proxy sets in shared memory*/
for(i=0;i<rtpp_sets;i++){
if(rtpengine_add_rtpengine_set(rtpp_strings[i]) !=0){
if(rtpengine_add_rtpengine_set(rtpp_strings[i], 0, 0) !=0){
for(;i<rtpp_sets;i++)
if(rtpp_strings[i])
pkg_free(rtpp_strings[i]);
Expand Down
1 change: 1 addition & 0 deletions modules/rtpengine/rtpengine.h
Expand Up @@ -61,6 +61,7 @@ struct rtpp_set_head{
};


struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url);
struct rtpp_set *get_rtpp_set(int set_id);
int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks);

Expand Down

0 comments on commit 0def328

Please sign in to comment.