apc:Fix AP not receiving hello packets

Fix firewall setting not being applied.
return incase the interap socket fails.
Clean up in failure conditions.

Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
This commit is contained in:
Chaitanya Godavarthi
2021-05-07 12:34:18 -04:00
committed by Rick Sommerville
parent 63f602a136
commit 93baf6d334
6 changed files with 62 additions and 3 deletions

View File

@@ -253,6 +253,10 @@ static void check_timer_handler(struct uloop_timeout *timeout)
if (CheckIp && (MyIpAddr != CheckIp)) if (CheckIp && (MyIpAddr != CheckIp))
{ {
printf("IP address changed from %x to %x - restart APC election\n", MyIpAddr, CheckIp); printf("IP address changed from %x to %x - restart APC election\n", MyIpAddr, CheckIp);
system("/usr/opensync/bin/ovsh u APC_State dr_addr:=0.0.0.0 bdr_addr:=0.0.0.0 enabled:=false mode:=NC");
uloop_done();
ubus_done();
interap_rcv_close();
exit(0); exit(0);
} }
@@ -266,6 +270,9 @@ static void check_timer_handler(struct uloop_timeout *timeout)
static void handle_signal(int signo) static void handle_signal(int signo)
{ {
uloop_done();
ubus_done();
interap_rcv_close();
system("/usr/opensync/bin/ovsh u APC_State dr_addr:=0.0.0.0 bdr_addr:=0.0.0.0 enabled:=false mode:=NC"); system("/usr/opensync/bin/ovsh u APC_State dr_addr:=0.0.0.0 bdr_addr:=0.0.0.0 enabled:=false mode:=NC");
} }
@@ -327,8 +334,10 @@ int main(int argc, char *const* argv)
callback cb = receive_from_socket; callback cb = receive_from_socket;
if (interap_recv(IAC_APC_ELECTION_PORT, cb, 1000, if (interap_recv(IAC_APC_ELECTION_PORT, cb, 1000,
NULL, NULL) < 0) NULL, NULL) < 0) {
printf("Error: Failed InterAP receive"); printf("Error: Failed InterAP receive");
return 1;
}
memset(Timers, 0, sizeof(Timers)); memset(Timers, 0, sizeof(Timers));
@@ -351,6 +360,7 @@ int main(int argc, char *const* argv)
uloop_run(); uloop_run();
uloop_done(); uloop_done();
ubus_done(); ubus_done();
interap_rcv_close();
return(1); return(1);
} }

View File

@@ -30,5 +30,8 @@ endef
define Package/libinterapcomm/install define Package/libinterapcomm/install
$(INSTALL_DIR) $(1)/usr/lib $(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libinterapcomm.so $(1)/usr/lib/ $(INSTALL_DATA) $(PKG_BUILD_DIR)/libinterapcomm.so $(1)/usr/lib/
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/interap.init $(1)/etc/init.d/interap
endef endef
$(eval $(call BuildPackage,libinterapcomm)) $(eval $(call BuildPackage,libinterapcomm))

View File

@@ -0,0 +1,35 @@
#!/bin/sh /etc/rc.common
START=12
STOP=12
start() {
apc=`cat /etc/config/firewall | grep Allow-APC`
ucc=`cat /etc/config/firewall | grep Allow-UCC`
if [ -z "$apc" ]; then
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-APC'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dst_port='50010'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].family='ipv4'
uci commit firewall
fi
if [ -z "$ucc" ]; then
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-UCC'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dst_port='50000'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].family='ipv4'
uci commit firewall
fi
}
stop() {
echo stop
}

View File

@@ -5,6 +5,7 @@ int interap_send(unsigned short port, char *dst_ip,
int interap_recv(unsigned short port, int (*recv_cb)(void *, ssize_t), int interap_recv(unsigned short port, int (*recv_cb)(void *, ssize_t),
unsigned int len, struct ev_loop *loop, unsigned int len, struct ev_loop *loop,
ev_io *io); ev_io *io);
void interap_rcv_close(void);
typedef int (*callback)(void *, ssize_t); typedef int (*callback)(void *, ssize_t);
typedef struct recv_arg { typedef struct recv_arg {

View File

@@ -22,8 +22,10 @@ static void receive_data_uloop(struct uloop_fd *fd, unsigned int events)
recv_data = malloc(ra.len); recv_data = malloc(ra.len);
memset(recv_data, 0, ra.len); memset(recv_data, 0, ra.len);
if ((recv_data_len = recvfrom(recv_sock, recv_data, ra.len, if ((recv_data_len = recvfrom(recv_sock, recv_data, ra.len,
0, NULL, 0)) < 0) 0, NULL, 0)) < 0) {
printf("recvfrom() failed"); printf("recvfrom() failed");
return;
}
ra.cb(recv_data, recv_data_len); ra.cb(recv_data, recv_data_len);
free(recv_data); free(recv_data);
@@ -99,6 +101,11 @@ int interap_recv(unsigned short port, int (*recv_cb)(void *, ssize_t),
return 0; return 0;
} }
void interap_rcv_close(void)
{
close(recv_sock);
}
int interap_send(unsigned short port, char *dst_ip, void *data, int interap_send(unsigned short port, char *dst_ip, void *data,
unsigned int len) unsigned int len)
{ {

View File

@@ -275,8 +275,10 @@ int main(int argc, char ** argv)
callback cb = recv_process; callback cb = recv_process;
LOGI("Call interap_recv"); LOGI("Call interap_recv");
if( interap_recv(IAC_VOIP_PORT, cb, sizeof(struct voip_session), if( interap_recv(IAC_VOIP_PORT, cb, sizeof(struct voip_session),
loop, &iac_io) < 0) loop, &iac_io) < 0) {
LOGI("Error: Failed InterAP receive"); LOGI("Error: Failed InterAP receive");
return 1;
}
// task_init(); // task_init();
netlink_listen(loop); netlink_listen(loop);
@@ -291,6 +293,7 @@ int main(int argc, char ** argv)
#endif #endif
ev_default_destroy(); ev_default_destroy();
interap_rcv_close();
LOGN("Exiting UCCM"); LOGN("Exiting UCCM");
return 0; return 0;