From 93baf6d33425eb307f72e9b80311932dc9671d62 Mon Sep 17 00:00:00 2001 From: Chaitanya Godavarthi Date: Fri, 7 May 2021 12:34:18 -0400 Subject: [PATCH] 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 --- feeds/wlan-ap/apc/src/src/apc_main.c | 12 ++++++- feeds/wlan-ap/interAPcomm/Makefile | 3 ++ feeds/wlan-ap/interAPcomm/files/interap.init | 35 +++++++++++++++++++ .../interAPcomm/src/include/interAPcomm.h | 1 + .../wlan-ap/interAPcomm/src/src/interAPcomm.c | 9 ++++- .../openwrt/src/ucc_detect/src/main.c | 5 ++- 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 feeds/wlan-ap/interAPcomm/files/interap.init diff --git a/feeds/wlan-ap/apc/src/src/apc_main.c b/feeds/wlan-ap/apc/src/src/apc_main.c index db0062879..c3280dd6a 100755 --- a/feeds/wlan-ap/apc/src/src/apc_main.c +++ b/feeds/wlan-ap/apc/src/src/apc_main.c @@ -253,6 +253,10 @@ static void check_timer_handler(struct uloop_timeout *timeout) if (CheckIp && (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); } @@ -266,6 +270,9 @@ static void check_timer_handler(struct uloop_timeout *timeout) 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"); } @@ -327,8 +334,10 @@ int main(int argc, char *const* argv) callback cb = receive_from_socket; if (interap_recv(IAC_APC_ELECTION_PORT, cb, 1000, - NULL, NULL) < 0) + NULL, NULL) < 0) { printf("Error: Failed InterAP receive"); + return 1; + } memset(Timers, 0, sizeof(Timers)); @@ -351,6 +360,7 @@ int main(int argc, char *const* argv) uloop_run(); uloop_done(); ubus_done(); + interap_rcv_close(); return(1); } diff --git a/feeds/wlan-ap/interAPcomm/Makefile b/feeds/wlan-ap/interAPcomm/Makefile index 28f6d2e52..33032e808 100644 --- a/feeds/wlan-ap/interAPcomm/Makefile +++ b/feeds/wlan-ap/interAPcomm/Makefile @@ -30,5 +30,8 @@ endef define Package/libinterapcomm/install $(INSTALL_DIR) $(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 $(eval $(call BuildPackage,libinterapcomm)) diff --git a/feeds/wlan-ap/interAPcomm/files/interap.init b/feeds/wlan-ap/interAPcomm/files/interap.init new file mode 100644 index 000000000..022086928 --- /dev/null +++ b/feeds/wlan-ap/interAPcomm/files/interap.init @@ -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 +} diff --git a/feeds/wlan-ap/interAPcomm/src/include/interAPcomm.h b/feeds/wlan-ap/interAPcomm/src/include/interAPcomm.h index aec325a69..e56de7f23 100644 --- a/feeds/wlan-ap/interAPcomm/src/include/interAPcomm.h +++ b/feeds/wlan-ap/interAPcomm/src/include/interAPcomm.h @@ -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), unsigned int len, struct ev_loop *loop, ev_io *io); +void interap_rcv_close(void); typedef int (*callback)(void *, ssize_t); typedef struct recv_arg { diff --git a/feeds/wlan-ap/interAPcomm/src/src/interAPcomm.c b/feeds/wlan-ap/interAPcomm/src/src/interAPcomm.c index 98ec29cfa..20e4113be 100644 --- a/feeds/wlan-ap/interAPcomm/src/src/interAPcomm.c +++ b/feeds/wlan-ap/interAPcomm/src/src/interAPcomm.c @@ -22,8 +22,10 @@ static void receive_data_uloop(struct uloop_fd *fd, unsigned int events) recv_data = malloc(ra.len); memset(recv_data, 0, ra.len); if ((recv_data_len = recvfrom(recv_sock, recv_data, ra.len, - 0, NULL, 0)) < 0) + 0, NULL, 0)) < 0) { printf("recvfrom() failed"); + return; + } ra.cb(recv_data, recv_data_len); free(recv_data); @@ -99,6 +101,11 @@ int interap_recv(unsigned short port, int (*recv_cb)(void *, ssize_t), return 0; } +void interap_rcv_close(void) +{ + close(recv_sock); +} + int interap_send(unsigned short port, char *dst_ip, void *data, unsigned int len) { diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/ucc_detect/src/main.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/ucc_detect/src/main.c index 3c5e89b57..d7c0c7d46 100644 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/ucc_detect/src/main.c +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/ucc_detect/src/main.c @@ -275,8 +275,10 @@ int main(int argc, char ** argv) callback cb = recv_process; LOGI("Call interap_recv"); if( interap_recv(IAC_VOIP_PORT, cb, sizeof(struct voip_session), - loop, &iac_io) < 0) + loop, &iac_io) < 0) { LOGI("Error: Failed InterAP receive"); + return 1; + } // task_init(); netlink_listen(loop); @@ -291,6 +293,7 @@ int main(int argc, char ** argv) #endif ev_default_destroy(); + interap_rcv_close(); LOGN("Exiting UCCM"); return 0;