getsockname() bugfix
This commit is contained in:
@@ -7,9 +7,6 @@
|
|||||||
# tests: build only test applications for host system
|
# tests: build only test applications for host system
|
||||||
# clean: removes all built files, objects, other trash
|
# clean: removes all built files, objects, other trash
|
||||||
|
|
||||||
GENERATED_FILES :=
|
|
||||||
DOC_DIR = doc
|
|
||||||
|
|
||||||
# Automagically pick clang or gcc, with preference for clang
|
# 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
|
# This is only done if we have not overridden these with an environment or CLI variable
|
||||||
ifeq ($(origin CC),default)
|
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
|
else
|
||||||
CFLAGS?=-O3 -fstack-protector
|
CFLAGS?=-O3 -fstack-protector
|
||||||
CFLAGS+=-Wall -fPIE -fvisibility=hidden -pthread $(INCLUDES) -DNDEBUG $(DEFS)
|
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)
|
CXXFLAGS+=-Wall -Wreorder -fPIE -fvisibility=hidden -fno-rtti -pthread $(INCLUDES) -DNDEBUG $(DEFS)
|
||||||
LDFLAGS=-ldl -pie -Wl,-z,relro,-z,now
|
LDFLAGS=-ldl -pie -Wl,-z,relro,-z,now
|
||||||
STRIP?=strip
|
STRIP?=strip
|
||||||
|
|||||||
@@ -605,26 +605,30 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock,void **uptr,void *data,uns
|
|||||||
rpcSock = sockdata.first;
|
rpcSock = sockdata.first;
|
||||||
buf = (unsigned char*)sockdata.second;
|
buf = (unsigned char*)sockdata.second;
|
||||||
unloadRPC(buf, pid, tid, rpcCount, timestamp, CANARY, cmd, payload);
|
unloadRPC(buf, pid, tid, rpcCount, timestamp, CANARY, cmd, payload);
|
||||||
dwr(MSG_DEBUG," <sock=%p> RPC: (pid=%d, tid=%d, rpcCount=%d, timestamp=%s, cmd=%d)\n",
|
dwr(MSG_DEBUG_EXTRA," <sock=%p> RPC: (pid=%d, tid=%d, rpcCount=%d, timestamp=%s, cmd=%d)\n",
|
||||||
(void*)&sock, pid, tid, rpcCount, timestamp, cmd);
|
(void*)&sock, pid, tid, rpcCount, timestamp, cmd);
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
case RPC_BIND:
|
case RPC_BIND:
|
||||||
|
dwr(MSG_DEBUG," <sock=%p> RPC_BIND\n", (void*)&sock);
|
||||||
struct bind_st bind_rpc;
|
struct bind_st bind_rpc;
|
||||||
memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st));
|
memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st));
|
||||||
handleBind(sock, rpcSock, uptr, &bind_rpc);
|
handleBind(sock, rpcSock, uptr, &bind_rpc);
|
||||||
break;
|
break;
|
||||||
case RPC_LISTEN:
|
case RPC_LISTEN:
|
||||||
|
dwr(MSG_DEBUG," <sock=%p> RPC_LISTEN\n", (void*)&sock);
|
||||||
struct listen_st listen_rpc;
|
struct listen_st listen_rpc;
|
||||||
memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st));
|
memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st));
|
||||||
handleListen(sock, rpcSock, uptr, &listen_rpc);
|
handleListen(sock, rpcSock, uptr, &listen_rpc);
|
||||||
break;
|
break;
|
||||||
case RPC_GETSOCKNAME:
|
case RPC_GETSOCKNAME:
|
||||||
|
dwr(MSG_DEBUG," <sock=%p> RPC_GETSOCKNAME\n", (void*)&sock);
|
||||||
struct getsockname_st getsockname_rpc;
|
struct getsockname_st getsockname_rpc;
|
||||||
memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
|
memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
|
||||||
handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc);
|
handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc);
|
||||||
break;
|
break;
|
||||||
case RPC_CONNECT:
|
case RPC_CONNECT:
|
||||||
|
dwr(MSG_DEBUG," <sock=%p> RPC_CONNECT\n", (void*)&sock);
|
||||||
struct connect_st connect_rpc;
|
struct connect_st connect_rpc;
|
||||||
memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st));
|
memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st));
|
||||||
handleConnect(sock, rpcSock, conn, &connect_rpc);
|
handleConnect(sock, rpcSock, conn, &connect_rpc);
|
||||||
@@ -927,11 +931,7 @@ void NetconEthernetTap::handleGetsockname(PhySocket *sock, PhySocket *rpcSock, v
|
|||||||
{
|
{
|
||||||
Mutex::Lock _l(_tcpconns_m);
|
Mutex::Lock _l(_tcpconns_m);
|
||||||
Connection *conn = getConnection(sock);
|
Connection *conn = getConnection(sock);
|
||||||
char retmsg[sizeof(struct sockaddr_storage)];
|
write(_phy.getDescriptor(rpcSock), &conn->addr, 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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **uptr, struct bind_st *bind_rpc)
|
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;
|
ip_addr_t connAddr;
|
||||||
connAddr.addr = *((u32_t *)_ips[0].rawIpData());
|
connAddr.addr = *((u32_t *)_ips[0].rawIpData());
|
||||||
Connection *conn = getConnection(sock);
|
Connection *conn = getConnection(sock);
|
||||||
|
|
||||||
dwr(MSG_DEBUG," handleBind(sock=%p,fd=%d,port=%d)\n", (void*)&sock, bind_rpc->sockfd, port);
|
dwr(MSG_DEBUG," handleBind(sock=%p,fd=%d,port=%d)\n", (void*)&sock, bind_rpc->sockfd, port);
|
||||||
if(conn) {
|
if(conn) {
|
||||||
if(conn->type == SOCK_DGRAM) {
|
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
|
if(err == ERR_USE) // port in use
|
||||||
sendReturnValue(rpcSock, -1, EADDRINUSE);
|
sendReturnValue(rpcSock, -1, EADDRINUSE);
|
||||||
else {
|
else {
|
||||||
lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn));
|
lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn));
|
||||||
conn->port = conn->UDP_pcb->local_port;
|
struct sockaddr_in addr_in;
|
||||||
// Update port to assigned port
|
|
||||||
struct sockaddr_in addr_in;
|
|
||||||
memcpy(&addr_in, &bind_rpc->addr, sizeof(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));
|
memcpy(&conn->addr, &addr_in, sizeof(addr_in));
|
||||||
sendReturnValue(rpcSock, ERR_OK, ERR_OK); // Success
|
sendReturnValue(rpcSock, ERR_OK, ERR_OK); // Success
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
int ld;
|
int ld;
|
||||||
struct sockaddr_in skaddr;
|
struct sockaddr_in skaddr;
|
||||||
|
|
||||||
|
struct sockaddr_in skaddr2;
|
||||||
|
|
||||||
int length;
|
int length;
|
||||||
|
|
||||||
// create socket
|
// create socket
|
||||||
@@ -63,7 +66,8 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// create address
|
// create address
|
||||||
skaddr.sin_family = AF_INET;
|
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);
|
skaddr.sin_port = htons(0);
|
||||||
|
|
||||||
// bind to address
|
// bind to address
|
||||||
@@ -74,14 +78,22 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
/* find out what port we were assigned and print it out */
|
/* find out what port we were assigned and print it out */
|
||||||
|
|
||||||
length = sizeof( skaddr );
|
length = sizeof( skaddr2 );
|
||||||
if (getsockname(ld, (struct sockaddr *) &skaddr, &length)<0) {
|
if (getsockname(ld, (struct sockaddr *) &skaddr2, &length)<0) {
|
||||||
printf("error getsockname\n");
|
printf("error getsockname\n");
|
||||||
exit(1);
|
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 every datagram */
|
||||||
echo(ld);
|
//echo(ld);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user