qnlink uses unix sockets

pull/12/head
Tom Early 7 years ago
parent 51a929ce54
commit 1549de9d20

@ -58,7 +58,7 @@ qngateway : $(IRCOBJS) QnetGateway.o aprs.o UnixDgramSocket.o
g++ $(CPPFLAGS) -o qngateway QnetGateway.o aprs.o UnixDgramSocket.o $(IRCOBJS) $(LDFLAGS) -pthread g++ $(CPPFLAGS) -o qngateway QnetGateway.o aprs.o UnixDgramSocket.o $(IRCOBJS) $(LDFLAGS) -pthread
qnlink : QnetLink.o DPlusAuthenticator.o TCPReaderWriterClient.o Random.o UnixDgramSocket.o qnlink : QnetLink.o DPlusAuthenticator.o TCPReaderWriterClient.o Random.o UnixDgramSocket.o
g++ $(CPPFLAGS) -o qnlink QnetLink.o DPlusAuthenticator.o TCPReaderWriterClient.o Random.o $(LDFLAGS) -pthread g++ $(CPPFLAGS) -o qnlink QnetLink.o DPlusAuthenticator.o TCPReaderWriterClient.o Random.o UnixDgramSocket.o $(LDFLAGS) -pthread
qnrelay : QnetRelay.o UnixDgramSocket.o qnrelay : QnetRelay.o UnixDgramSocket.o
g++ $(CPPFLAGS) -o qnrelay QnetRelay.o $(LDFLAGS) g++ $(CPPFLAGS) -o qnrelay QnetRelay.o $(LDFLAGS)

@ -210,7 +210,7 @@ void CQnetLink::RptrAckThread(char *arg)
memcpy(dsvt.hdr.sfx, "RPTR", 4); memcpy(dsvt.hdr.sfx, "RPTR", 4);
calcPFCS(dsvt.title,56); calcPFCS(dsvt.title,56);
sendto(rptr_sock, dsvt.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(toLocalg2)); Link2Gate.Write(dsvt.title, 56);
std::this_thread::sleep_for(std::chrono::milliseconds(delay_between)); std::this_thread::sleep_for(std::chrono::milliseconds(delay_between));
dsvt.config = 0x20; dsvt.config = 0x20;
@ -273,7 +273,7 @@ void CQnetLink::RptrAckThread(char *arg)
dsvt.vasd.text[2] = 0xf5; dsvt.vasd.text[2] = 0xf5;
break; break;
} }
sendto(rptr_sock, dsvt.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(toLocalg2)); Link2Gate.Write(dsvt.title, 27);
if (i < 9) if (i < 9)
std::this_thread::sleep_for(std::chrono::milliseconds(delay_between)); std::this_thread::sleep_for(std::chrono::milliseconds(delay_between));
} }
@ -671,13 +671,8 @@ bool CQnetLink::read_config(const char *cfgFile)
get_value(cfg, "link.xrf_port", rmt_xrf_port, 10000, 65535, 30001); get_value(cfg, "link.xrf_port", rmt_xrf_port, 10000, 65535, 30001);
get_value(cfg, "link.dcs_port", rmt_dcs_port, 10000, 65535, 30051); get_value(cfg, "link.dcs_port", rmt_dcs_port, 10000, 65535, 30051);
if (! get_value(cfg, "link.incoming_ip", my_g2_link_ip, 7, IP_SIZE, "0.0.0.0")) get_value(cfg, "gateway.tolink", gate2link, 1, FILENAME_MAX, "gate2link");
return true; get_value(cfg, "gateway.fromlink", link2gate, 1, FILENAME_MAX, "link2gate");
get_value(cfg, "link.port", my_g2_link_port, 10000, 65535, 18997);
if (! get_value(cfg, "gateway.internal.ip", to_g2_external_ip, 7, IP_SIZE, "0.0.0.0"))
return true;
get_value(cfg, "gateway.external.port", to_g2_external_port, 1024, 65535, 40000);
get_value(cfg, "log.qso", qso_details, true); get_value(cfg, "log.qso", qso_details, true);
@ -746,8 +741,7 @@ bool CQnetLink::srv_open()
sin.sin_addr.s_addr = inet_addr(my_g2_link_ip.c_str()); sin.sin_addr.s_addr = inet_addr(my_g2_link_ip.c_str());
sin.sin_port = htons(rmt_xrf_port); sin.sin_port = htons(rmt_xrf_port);
if (bind(xrf_g2_sock,(struct sockaddr *)&sin,sizeof(struct sockaddr_in)) != 0) { if (bind(xrf_g2_sock,(struct sockaddr *)&sin,sizeof(struct sockaddr_in)) != 0) {
printf("Failed to bind gateway socket on port %d for XRF, errno=%d\n", printf("Failed to bind gateway socket on port %d for XRF, errno=%d\n", rmt_xrf_port ,errno);
rmt_xrf_port ,errno);
close(xrf_g2_sock); close(xrf_g2_sock);
xrf_g2_sock = -1; xrf_g2_sock = -1;
return false; return false;
@ -790,44 +784,19 @@ bool CQnetLink::srv_open()
return false; return false;
} }
/* create our repeater socket */ /* create our gateway unix sockets */
rptr_sock = socket(PF_INET,SOCK_DGRAM,0); if (Gate2Link.Open(gate2link.c_str()) || Link2Gate.Open(link2gate.c_str())) {
if (rptr_sock == -1) {
printf("Failed to create repeater socket,errno=%d\n",errno);
close(dcs_g2_sock);
dcs_g2_sock = -1;
close(xrf_g2_sock);
xrf_g2_sock = -1;
close(ref_g2_sock);
ref_g2_sock = -1;
return false;
}
fcntl(rptr_sock,F_SETFL,O_NONBLOCK);
memset(&sin,0,sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(my_g2_link_ip.c_str());
sin.sin_port = htons(my_g2_link_port);
if (bind(rptr_sock,(struct sockaddr *)&sin,sizeof(struct sockaddr_in)) != 0) {
printf("Failed to bind repeater socket on port %d, errno=%d\n",
my_g2_link_port,errno);
close(dcs_g2_sock); close(dcs_g2_sock);
dcs_g2_sock = -1; dcs_g2_sock = -1;
close(rptr_sock);
rptr_sock = -1;
close(xrf_g2_sock); close(xrf_g2_sock);
xrf_g2_sock = -1; xrf_g2_sock = -1;
close(ref_g2_sock); close(ref_g2_sock);
ref_g2_sock = -1; ref_g2_sock = -1;
Gate2Link.Close();
Link2Gate.Close();
return false; return false;
} }
/* the local G2 external runs on this IP and port */
memset(&toLocalg2,0,sizeof(struct sockaddr_in));
toLocalg2.sin_family = AF_INET;
toLocalg2.sin_addr.s_addr = inet_addr(to_g2_external_ip.c_str());
toLocalg2.sin_port = htons(to_g2_external_port);
/* initialize all remote links */ /* initialize all remote links */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
to_remote_g2[i].to_call[0] = '\0'; to_remote_g2[i].to_call[0] = '\0';
@ -855,10 +824,8 @@ void CQnetLink::srv_close()
printf("Closed rmt_dcs_port\n"); printf("Closed rmt_dcs_port\n");
} }
if (rptr_sock != -1) { Gate2Link.Close();
close(rptr_sock); Link2Gate.Close();
printf("Closed my_g2_link_port\n");
}
if (ref_g2_sock != -1) { if (ref_g2_sock != -1) {
close(ref_g2_sock); close(ref_g2_sock);
@ -1095,12 +1062,12 @@ void CQnetLink::Process()
max_nfds = xrf_g2_sock; max_nfds = xrf_g2_sock;
if (ref_g2_sock > max_nfds) if (ref_g2_sock > max_nfds)
max_nfds = ref_g2_sock; max_nfds = ref_g2_sock;
if (rptr_sock > max_nfds)
max_nfds = rptr_sock;
if (dcs_g2_sock > max_nfds) if (dcs_g2_sock > max_nfds)
max_nfds = dcs_g2_sock; max_nfds = dcs_g2_sock;
if (Gate2Link.GetFD() > max_nfds)
max_nfds = Gate2Link.GetFD();
printf("xrf=%d, dcs=%d, ref=%d, rptr=%d, MAX+1=%d\n", xrf_g2_sock, dcs_g2_sock, ref_g2_sock, rptr_sock, max_nfds + 1); printf("xrf=%d, dcs=%d, ref=%d, gateway=%d, MAX+1=%d\n", xrf_g2_sock, dcs_g2_sock, ref_g2_sock, Gate2Link.GetFD(), max_nfds + 1);
if (strlen(link_at_startup) >= 8) { if (strlen(link_at_startup) >= 8) {
if ((link_at_startup[0] == 'A') || (link_at_startup[0] == 'B') || (link_at_startup[0] == 'C')) { if ((link_at_startup[0] == 'A') || (link_at_startup[0] == 'B') || (link_at_startup[0] == 'C')) {
@ -1275,13 +1242,13 @@ void CQnetLink::Process()
} }
FD_ZERO(&fdset); FD_ZERO(&fdset);
FD_SET(xrf_g2_sock,&fdset); FD_SET(xrf_g2_sock, &fdset);
FD_SET(dcs_g2_sock,&fdset); FD_SET(dcs_g2_sock, &fdset);
FD_SET(ref_g2_sock,&fdset); FD_SET(ref_g2_sock, &fdset);
FD_SET(rptr_sock,&fdset); FD_SET(Gate2Link.GetFD(), &fdset);
tv.tv_sec = 0; tv.tv_sec = 0;
tv.tv_usec = 20000; tv.tv_usec = 20000;
(void)select(max_nfds + 1,&fdset,0,0,&tv); (void)select(max_nfds + 1, &fdset, 0, 0, &tv);
if (FD_ISSET(xrf_g2_sock, &fdset)) { if (FD_ISSET(xrf_g2_sock, &fdset)) {
socklen_t fromlen = sizeof(struct sockaddr_in); socklen_t fromlen = sizeof(struct sockaddr_in);
@ -1588,7 +1555,7 @@ void CQnetLink::Process()
} }
/* relay data to our local G2 */ /* relay data to our local G2 */
sendto(rptr_sock, dsvt.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(dsvt.title, 56);
/* send data to donglers */ /* send data to donglers */
/* no changes here */ /* no changes here */
@ -1643,13 +1610,13 @@ void CQnetLink::Process()
calcPFCS(from_xrf_torptr_brd.title, 56); calcPFCS(from_xrf_torptr_brd.title, 56);
/* send the data to the local gateway/repeater */ /* send the data to the local gateway/repeater */
sendto(rptr_sock, from_xrf_torptr_brd.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(from_xrf_torptr_brd.title, 56);
/* save streamid for use with the audio packets that will arrive after this header */ /* save streamid for use with the audio packets that will arrive after this header */
brd_from_xrf.xrf_streamid = dsvt.streamid; brd_from_xrf.xrf_streamid = dsvt.streamid;
brd_from_xrf.rptr_streamid[brd_from_xrf_idx] = from_xrf_torptr_brd.streamid; brd_from_xrf.rptr_streamid[brd_from_xrf_idx] = from_xrf_torptr_brd.streamid;
brd_from_xrf_idx ++; brd_from_xrf_idx++;
} }
} }
} }
@ -1739,7 +1706,7 @@ void CQnetLink::Process()
} }
/* relay data to our local G2 */ /* relay data to our local G2 */
sendto(rptr_sock, dsvt.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(dsvt.title, 27);
/* send data to donglers */ /* send data to donglers */
/* no changes here */ /* no changes here */
@ -1763,12 +1730,12 @@ void CQnetLink::Process()
if (brd_from_xrf.rptr_streamid[0] != 0x0) { if (brd_from_xrf.rptr_streamid[0] != 0x0) {
from_xrf_torptr_brd.streamid = brd_from_xrf.rptr_streamid[0]; from_xrf_torptr_brd.streamid = brd_from_xrf.rptr_streamid[0];
sendto(rptr_sock, from_xrf_torptr_brd.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(from_xrf_torptr_brd.title, 27);
} }
if (brd_from_xrf.rptr_streamid[1] != 0x0) { if (brd_from_xrf.rptr_streamid[1] != 0x0) {
from_xrf_torptr_brd.streamid = brd_from_xrf.rptr_streamid[1]; from_xrf_torptr_brd.streamid = brd_from_xrf.rptr_streamid[1];
sendto(rptr_sock, from_xrf_torptr_brd.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(from_xrf_torptr_brd.title, 27);
} }
if (dsvt.ctrl & 0x40) { if (dsvt.ctrl & 0x40) {
@ -2463,7 +2430,7 @@ void CQnetLink::Process()
} }
/* send the data to the local gateway/repeater */ /* send the data to the local gateway/repeater */
sendto(rptr_sock, rdsvt.dsvt.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(rdsvt.dsvt.title, 56);
/* send the data to the donglers */ /* send the data to the donglers */
for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) { for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) {
@ -2521,7 +2488,7 @@ void CQnetLink::Process()
} }
/* send the data to the local gateway/repeater */ /* send the data to the local gateway/repeater */
sendto(rptr_sock, rdsvt.dsvt.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(rdsvt.dsvt.title, 27);
/* send the data to the donglers */ /* send the data to the donglers */
for (pos = inbound_list.begin(); pos != inbound_list.end(); pos++) { for (pos = inbound_list.begin(); pos != inbound_list.end(); pos++) {
@ -2674,7 +2641,7 @@ void CQnetLink::Process()
/* send the header to the local gateway/repeater */ /* send the header to the local gateway/repeater */
for (int j=0; j<5; j++) for (int j=0; j<5; j++)
sendto(rptr_sock, rdsvt.dsvt.title, 56, 0, (struct sockaddr *)&toLocalg2,sizeof(struct sockaddr_in)); Link2Gate.Write(rdsvt.dsvt.title, 56);
/* send the data to the donglers */ /* send the data to the donglers */
for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) { for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) {
@ -2707,7 +2674,7 @@ void CQnetLink::Process()
memcpy(rdsvt.dsvt.vasd.voice, dcs_buf+46, 12); memcpy(rdsvt.dsvt.vasd.voice, dcs_buf+46, 12);
/* send the data to the local gateway/repeater */ /* send the data to the local gateway/repeater */
sendto(rptr_sock, rdsvt.dsvt.title, 27, 0, (struct sockaddr *)&toLocalg2,sizeof(struct sockaddr_in)); Link2Gate.Write(rdsvt.dsvt.title, 27);
/* send the data to the donglers */ /* send the data to the donglers */
for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) { for (auto pos = inbound_list.begin(); pos != inbound_list.end(); pos++) {
@ -2811,10 +2778,9 @@ void CQnetLink::Process()
FD_CLR (dcs_g2_sock,&fdset); FD_CLR (dcs_g2_sock,&fdset);
} }
if (FD_ISSET(rptr_sock, &fdset)) { if (FD_ISSET(Gate2Link.GetFD(), &fdset)) {
socklen_t fromlen = sizeof(struct sockaddr_in);
SDSTR dstr; SDSTR dstr;
int length = recvfrom(rptr_sock, dstr.pkt_id, 100, 0, (struct sockaddr *)&fromRptr,&fromlen); int length = Gate2Link.Read(dstr.pkt_id, 100);
if ((length==58 || length==29 || length==32) && dstr.flag[0]==0x73 && dstr.flag[1] == 0x12 && dstr.flag[2] ==0x0 && (0==memcmp(dstr.pkt_id,"DSTR", 4) || 0==memcmp(dstr.pkt_id,"CCS_", 4)) && dstr.vpkt.icm_id==0x20 && (dstr.remaining==0x30 || dstr.remaining==0x13 || dstr.remaining==0x16)) { if ((length==58 || length==29 || length==32) && dstr.flag[0]==0x73 && dstr.flag[1] == 0x12 && dstr.flag[2] ==0x0 && (0==memcmp(dstr.pkt_id,"DSTR", 4) || 0==memcmp(dstr.pkt_id,"CCS_", 4)) && dstr.vpkt.icm_id==0x20 && (dstr.remaining==0x30 || dstr.remaining==0x13 || dstr.remaining==0x16)) {
@ -3062,7 +3028,7 @@ void CQnetLink::Process()
calcPFCS(fromrptr_torptr_brd.title, 56); calcPFCS(fromrptr_torptr_brd.title, 56);
sendto(xrf_g2_sock, fromrptr_torptr_brd.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(fromrptr_torptr_brd.title, 56);
brd_from_rptr.from_rptr_streamid = dstr.vpkt.streamid; brd_from_rptr.from_rptr_streamid = dstr.vpkt.streamid;
brd_from_rptr.to_rptr_streamid[brd_from_rptr_idx] = fromrptr_torptr_brd.streamid; brd_from_rptr.to_rptr_streamid[brd_from_rptr_idx] = fromrptr_torptr_brd.streamid;
@ -3163,12 +3129,12 @@ void CQnetLink::Process()
if (brd_from_rptr.to_rptr_streamid[0]) { if (brd_from_rptr.to_rptr_streamid[0]) {
fromrptr_torptr_brd.streamid = brd_from_rptr.to_rptr_streamid[0]; fromrptr_torptr_brd.streamid = brd_from_rptr.to_rptr_streamid[0];
sendto(xrf_g2_sock, fromrptr_torptr_brd.title, 27, 0, (struct sockaddr *)&toLocalg2,sizeof(struct sockaddr_in)); Link2Gate.Write(fromrptr_torptr_brd.title, 27);
} }
if (brd_from_rptr.to_rptr_streamid[1]) { if (brd_from_rptr.to_rptr_streamid[1]) {
fromrptr_torptr_brd.streamid = brd_from_rptr.to_rptr_streamid[1]; fromrptr_torptr_brd.streamid = brd_from_rptr.to_rptr_streamid[1];
sendto(xrf_g2_sock, fromrptr_torptr_brd.title, 27, 0, (struct sockaddr *)&toLocalg2,sizeof(struct sockaddr_in)); Link2Gate.Write(fromrptr_torptr_brd.title, 27);
} }
if (dstr.vpkt.ctrl & 0x40U) { if (dstr.vpkt.ctrl & 0x40U) {
@ -3310,7 +3276,7 @@ void CQnetLink::Process()
} }
} }
} }
FD_CLR (rptr_sock,&fdset); FD_CLR (Gate2Link.GetFD(), &fdset);
} }
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
if (notify_msg[i][0] && 0x0U == tracing[i].streamid) { if (notify_msg[i][0] && 0x0U == tracing[i].streamid) {
@ -3420,7 +3386,7 @@ void CQnetLink::AudioNotifyThread(SECHO &edata)
return; return;
} }
sendto(rptr_sock, edata.header.title, 56, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(edata.header.title, 56);
edata.header.config = 0x20U; edata.header.config = 0x20U;
@ -3483,7 +3449,7 @@ void CQnetLink::AudioNotifyThread(SECHO &edata)
} }
if (count+1 == ambeblocks && ! edata.is_linked) if (count+1 == ambeblocks && ! edata.is_linked)
edata.header.ctrl |= 0x40U; edata.header.ctrl |= 0x40U;
sendto(rptr_sock, edata.header.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(edata.header.title, 27);
} }
std::this_thread::sleep_for(std::chrono::milliseconds(delay_between)); std::this_thread::sleep_for(std::chrono::milliseconds(delay_between));
} }
@ -3536,7 +3502,7 @@ void CQnetLink::AudioNotifyThread(SECHO &edata)
memcpy(edata.header.vasd.text, edata.header.ctrl ? sdsilence : sdsync, 3); memcpy(edata.header.vasd.text, edata.header.ctrl ? sdsilence : sdsync, 3);
if (i+1==size && lastch) if (i+1==size && lastch)
edata.header.ctrl |= 0x40U; // signal the last voiceframe (of the last character) edata.header.ctrl |= 0x40U; // signal the last voiceframe (of the last character)
sendto(rptr_sock, edata.header.title, 27, 0, (struct sockaddr *)&toLocalg2, sizeof(struct sockaddr_in)); Link2Gate.Write(edata.header.title, 27);
} }
std::this_thread::sleep_for(std::chrono::milliseconds(delay_between)); std::this_thread::sleep_for(std::chrono::milliseconds(delay_between));
} }

@ -30,6 +30,7 @@
#include "QnetTypeDefs.h" #include "QnetTypeDefs.h"
#include "SEcho.h" #include "SEcho.h"
#include "Random.h" #include "Random.h"
#include "UnixDgramSocket.h"
using namespace libconfig; using namespace libconfig;
@ -138,12 +139,13 @@ private:
} tracing[3]; } tracing[3];
// input from remote // input from remote
int xrf_g2_sock, ref_g2_sock, dcs_g2_sock, rptr_sock; int xrf_g2_sock, ref_g2_sock, dcs_g2_sock;
struct sockaddr_in fromDst4; struct sockaddr_in fromDst4;
// After we receive it from remote g2, // unix sockets to gateway
// we must feed it to our local repeater. std::string link2gate, gate2link;
struct sockaddr_in toLocalg2; CUnixDgramReader Gate2Link;
CUnixDgramWriter Link2Gate;
// input from our own local repeater // input from our own local repeater
struct sockaddr_in fromRptr; struct sockaddr_in fromRptr;

Loading…
Cancel
Save

Powered by TurnKey Linux.