diff --git a/QnetVoice.cpp b/QnetVoice.cpp index 495501a..a0abb48 100644 --- a/QnetVoice.cpp +++ b/QnetVoice.cpp @@ -42,15 +42,17 @@ using namespace libconfig; #define VERSION "v3.1" -int sockDst = -1; -struct sockaddr_in toDst; +int sockFrm = -1; FILE *fp = NULL; time_t tNow = 0; -short streamid_raw = 0; +unsigned short streamid_raw = 0U; int moduleport[3] = { 0, 0, 0 }; std::string moduleip[3]; std::string REPEATER; -int PORT, PLAY_WAIT, PLAY_DELAY; +std::string FROM_ADDRESS; +int FROM_PORT; + +int PLAY_WAIT, PLAY_DELAY; bool is_icom = false; unsigned short crc_tabccitt[256] = { @@ -94,41 +96,43 @@ void calcPFCS(unsigned char rawbytes[58]) } -bool dst_open(const char *ip, const short port) +bool dst_open(const char *ip, const unsigned short int port) { - sockDst = socket(PF_INET,SOCK_DGRAM,0); - if (sockDst == -1) { + sockFrm = socket(PF_INET,SOCK_DGRAM,0); + if (sockFrm == -1) { printf("Failed to create DSTAR socket\n"); return true; } - fcntl(sockDst,F_SETFL,O_NONBLOCK); + fcntl(sockFrm,F_SETFL,O_NONBLOCK); int reuse = 1; - if (setsockopt(sockDst,SOL_SOCKET,SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) { - close(sockDst); - sockDst = -1; + if (setsockopt(sockFrm,SOL_SOCKET,SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) { + close(sockFrm); + sockFrm = -1; printf("setsockopt DSTAR REUSE failed\n"); return true; } - memset(&toDst,0,sizeof(struct sockaddr_in)); - toDst.sin_family = AF_INET; - toDst.sin_port = htons(port); - toDst.sin_addr.s_addr = inet_addr(ip); - -// if (bind(sockDst, (struct sockaddr *)&toDst, sizeof(struct sockaddr_in)) != 0) { -// printf("Failed to bind %s:%d, errno=%d, %s\n", ip, port, errno, strerror(errno)); -// close(sockDst); -// sockDst = -1; -// return true; -// } + + struct sockaddr_in fromAddr; + memset(&fromAddr, 0, sizeof(struct sockaddr_in)); + fromAddr.sin_family = AF_INET; + fromAddr.sin_port = htons(port); + fromAddr.sin_addr.s_addr = inet_addr(ip); + + if (bind(sockFrm, (struct sockaddr *)&fromAddr, sizeof(struct sockaddr_in)) != 0) { + printf("Failed to bind %s:%d, errno=%d, %s\n", ip, port, errno, strerror(errno)); + close(sockFrm); + sockFrm = -1; + return true; + } return false; } void dst_close() { - if (sockDst != -1) { - close(sockDst); - sockDst = -1; + if (sockFrm != -1) { + close(sockFrm); + sockFrm = -1; } return; } @@ -199,6 +203,10 @@ bool read_config(const char *cfgFile) REPEATER.resize(6, ' '); printf("REPEATER=[%s]\n", REPEATER.c_str()); + if (! get_value(cfg, "gateway.ip", FROM_ADDRESS, 7, 15, "127.0.0.1")) + return true; + get_value(cfg, "gateway.internal.ip", FROM_PORT, 1000, 65535, 19000); + for (short int m=0; m<3; m++) { std::string path = "module."; path += m + 'a'; @@ -271,12 +279,17 @@ int main(int argc, char *argv[]) return 1; } - PORT = moduleport[module - 'A']; - std::string IP_ADDRESS(moduleip[module - 'A']); - if (0 == PORT) { + // set up the destination port + int m = module - 'A'; + if (0 >= moduleport[m]) { printf("module %c has no port defined!\n", module); return 1; } + struct sockaddr_in toAddr; + memset(&toAddr, 0, sizeof(struct sockaddr_in)); + toAddr.sin_family = AF_INET; + toAddr.sin_addr.s_addr = inet_addr(moduleip[m].c_str()); + toAddr.sin_port = htons((unsigned short int)moduleport[m]); if (strlen(argv[2]) > 8) { printf("MYCALL can not be more than 8 characters, %s is invalid\n", argv[2]); @@ -316,10 +329,10 @@ int main(int argc, char *argv[]) time(&tNow); CRandom Random; - short int sport = (short int)PORT; - if (dst_open(IP_ADDRESS.c_str(), sport)) + unsigned short int uiport = (unsigned short int)FROM_PORT; + if (dst_open(FROM_ADDRESS.c_str(), uiport)) return 1; - printf("Opened %s:%u for writing\n", IP_ADDRESS.c_str(), sport); + printf("Opened %s:%u for writing\n", FROM_ADDRESS.c_str(), uiport); // Read and reformat and write packets while (true) { @@ -341,11 +354,6 @@ int main(int argc, char *argv[]) /* read the packet */ nread = fread(dsvt.title, rlen, 1, fp); printf("Read %d byte packet from %s\n", (int)nread*rlen, argv[3]); - if (rlen == 56) - printf("rpt1=%.8s rpt2=%.8s urcall=%.8s, mycall=%.8s, sfx=%.4s\n", - dsvt.hdr.rpt1, dsvt.hdr.rpt2, dsvt.hdr.urcall, dsvt.hdr.mycall, dsvt.hdr.sfx); - else - printf("streamid=%04X counter=%02X\n", dsvt.streamid, dsvt.counter); if (nread == 1) { if (memcmp(dsvt.title, "DSVT", 4) != 0) { printf("DVST title not found\n"); @@ -364,6 +372,7 @@ int main(int argc, char *argv[]) dstr.counter = htons(G2_COUNTER++); if (rlen == 56) { + printf("r1=%.8s r2=%.8s ur=%.8s, my=%.8s/%.4s\n", dsvt.hdr.rpt1, dsvt.hdr.rpt2, dsvt.hdr.urcall, dsvt.hdr.mycall, dsvt.hdr.sfx); memcpy(dstr.pkt_id, "DSTR", 4); dstr.flag[0] = 0x73; dstr.flag[1] = 0x12; @@ -440,13 +449,11 @@ int main(int argc, char *argv[]) } } - int sent = sendto(sockDst, dstr.pkt_id, rlen + 2,0, (struct sockaddr *)&toDst, sizeof(toDst)); + int sent = sendto(sockFrm, dstr.pkt_id, rlen + 2,0, (struct sockaddr *)&toAddr, sizeof(toAddr)); if (sent == 58) printf("Sent DSTR HDR ur=%.8s r1=%.8s r2=%.8s my=%.8s/%.4s\n", dstr.vpkt.hdr.ur, dstr.vpkt.hdr.r1, dstr.vpkt.hdr.r2, dstr.vpkt.hdr.my, dstr.vpkt.hdr.nm); - else if (sent == 29) - printf("Sent DSTR DATA streamid=%04X, ctrl=%02X\n", dstr.vpkt.streamid, dstr.vpkt.ctrl); - else + else if (sent != 29) printf("ERROR: sendto returned %d!\n", sent); } usleep(delay);