diff --git a/make-linux.mk b/make-linux.mk index d22ffb1..125e77e 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -7,9 +7,6 @@ # tests: build only test applications for host system # clean: removes all built files, objects, other trash -GENERATED_FILES := -DOC_DIR = doc - # Automagically pick clang or gcc, with preference for clang # This is only done if we have not overridden these with an environment or CLI variable ifeq ($(origin CC),default) @@ -39,7 +36,7 @@ ext/lz4/lz4.o node/Salsa20.o node/SHA512.o node/C25519.o node/Poly1305.o: CFLAGS else CFLAGS?=-O3 -fstack-protector CFLAGS+=-Wall -fPIE -fvisibility=hidden -pthread $(INCLUDES) -DNDEBUG $(DEFS) - CXXFLAGS?=-O3 -fstack-protector + CXXFLAGS?= -fstack-protector CXXFLAGS+=-Wall -Wreorder -fPIE -fvisibility=hidden -fno-rtti -pthread $(INCLUDES) -DNDEBUG $(DEFS) LDFLAGS=-ldl -pie -Wl,-z,relro,-z,now STRIP?=strip diff --git a/src/SDK_EthernetTap.cpp b/src/SDK_EthernetTap.cpp index 0940a09..02c0d59 100644 --- a/src/SDK_EthernetTap.cpp +++ b/src/SDK_EthernetTap.cpp @@ -605,26 +605,30 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock,void **uptr,void *data,uns rpcSock = sockdata.first; buf = (unsigned char*)sockdata.second; unloadRPC(buf, pid, tid, rpcCount, timestamp, CANARY, cmd, payload); - dwr(MSG_DEBUG," RPC: (pid=%d, tid=%d, rpcCount=%d, timestamp=%s, cmd=%d)\n", + dwr(MSG_DEBUG_EXTRA," RPC: (pid=%d, tid=%d, rpcCount=%d, timestamp=%s, cmd=%d)\n", (void*)&sock, pid, tid, rpcCount, timestamp, cmd); switch(cmd) { case RPC_BIND: + dwr(MSG_DEBUG," RPC_BIND\n", (void*)&sock); struct bind_st bind_rpc; memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st)); handleBind(sock, rpcSock, uptr, &bind_rpc); break; case RPC_LISTEN: + dwr(MSG_DEBUG," RPC_LISTEN\n", (void*)&sock); struct listen_st listen_rpc; memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st)); handleListen(sock, rpcSock, uptr, &listen_rpc); break; case RPC_GETSOCKNAME: + dwr(MSG_DEBUG," RPC_GETSOCKNAME\n", (void*)&sock); struct getsockname_st getsockname_rpc; memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st)); handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc); break; case RPC_CONNECT: + dwr(MSG_DEBUG," RPC_CONNECT\n", (void*)&sock); struct connect_st connect_rpc; memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st)); handleConnect(sock, rpcSock, conn, &connect_rpc); @@ -927,11 +931,7 @@ void NetconEthernetTap::handleGetsockname(PhySocket *sock, PhySocket *rpcSock, v { Mutex::Lock _l(_tcpconns_m); Connection *conn = getConnection(sock); - char retmsg[sizeof(struct sockaddr_storage)]; - memset(&retmsg, 0, sizeof(retmsg)); - if ((conn)&&(conn->addr)) - memcpy(&retmsg, conn->addr, sizeof(struct sockaddr_storage)); - write(_phy.getDescriptor(rpcSock), &retmsg, sizeof(struct sockaddr_storage)); + write(_phy.getDescriptor(rpcSock), &conn->addr, sizeof(struct sockaddr_storage)); } void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **uptr, struct bind_st *bind_rpc) @@ -942,6 +942,7 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u ip_addr_t connAddr; connAddr.addr = *((u32_t *)_ips[0].rawIpData()); Connection *conn = getConnection(sock); + dwr(MSG_DEBUG," handleBind(sock=%p,fd=%d,port=%d)\n", (void*)&sock, bind_rpc->sockfd, port); if(conn) { if(conn->type == SOCK_DGRAM) { @@ -954,14 +955,12 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u if(err == ERR_USE) // port in use sendReturnValue(rpcSock, -1, EADDRINUSE); else { - lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn)); - conn->port = conn->UDP_pcb->local_port; - // Update port to assigned port - struct sockaddr_in addr_in; + lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn)); + struct sockaddr_in addr_in; memcpy(&addr_in, &bind_rpc->addr, sizeof(addr_in)); - addr_in.sin_port = Utils::ntoh(conn->UDP_pcb->local_port); + addr_in.sin_port = Utils::ntoh(conn->UDP_pcb->local_port); // Newly assigned port memcpy(&conn->addr, &addr_in, sizeof(addr_in)); - sendReturnValue(rpcSock, ERR_OK, ERR_OK); // Success + sendReturnValue(rpcSock, ERR_OK, ERR_OK); // Success } return; } diff --git a/tests/udp_server.c b/tests/udp_server.c index e9f8614..0ad26f9 100755 --- a/tests/udp_server.c +++ b/tests/udp_server.c @@ -53,6 +53,9 @@ int main(int argc, char *argv[]) { int ld; struct sockaddr_in skaddr; + + struct sockaddr_in skaddr2; + int length; // create socket @@ -63,7 +66,8 @@ int main(int argc, char *argv[]) { // create address skaddr.sin_family = AF_INET; - skaddr.sin_addr.s_addr = htonl(INADDR_ANY); + //skaddr.sin_addr.s_addr = htonl(INADDR_ANY); + skaddr.sin_addr.s_addr = inet_addr("10.5.5.2"); skaddr.sin_port = htons(0); // bind to address @@ -74,14 +78,22 @@ int main(int argc, char *argv[]) { /* find out what port we were assigned and print it out */ - length = sizeof( skaddr ); - if (getsockname(ld, (struct sockaddr *) &skaddr, &length)<0) { + length = sizeof( skaddr2 ); + if (getsockname(ld, (struct sockaddr *) &skaddr2, &length)<0) { printf("error getsockname\n"); exit(1); } - printf("server UDP port = %d\n",ntohs(skaddr.sin_port)); + int port = skaddr2.sin_port; + int ip = ntohs(skaddr2.sin_addr.s_addr); + unsigned char d[4]; + d[0] = ip & 0xFF; + d[1] = (ip >> 8) & 0xFF; + d[2] = (ip >> 16) & 0xFF; + d[3] = (ip >> 24) & 0xFF; + printf(" handleBind(): %d.%d.%d.%d : %d -> Assigned: %d\n", d[0],d[1],d[2],d[3], port); + /* echo every datagram */ - echo(ld); + //echo(ld); return(0); }