|
@@ -50,12 +50,12 @@ void CheckAndHandleConsumingUdpSockets(void);
|
|
|
EipStatus HandleDataOnTcpSocket(int socket);
|
|
EipStatus HandleDataOnTcpSocket(int socket);
|
|
|
|
|
|
|
|
/*************************************************
|
|
/*************************************************
|
|
|
- * Function implementations from now on
|
|
|
|
|
- *************************************************/
|
|
|
|
|
|
|
+* Function implementations from now on
|
|
|
|
|
+*************************************************/
|
|
|
|
|
|
|
|
EipStatus NetworkHandlerInitialize(void) {
|
|
EipStatus NetworkHandlerInitialize(void) {
|
|
|
|
|
|
|
|
- if(kEipStatusOk != NetworkHandlerInitializePlatform()) {
|
|
|
|
|
|
|
+ if( kEipStatusOk != NetworkHandlerInitializePlatform() ) {
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -64,122 +64,141 @@ EipStatus NetworkHandlerInitialize(void) {
|
|
|
FD_ZERO(&read_socket);
|
|
FD_ZERO(&read_socket);
|
|
|
|
|
|
|
|
/* create a new TCP socket */
|
|
/* create a new TCP socket */
|
|
|
- if ((g_network_status.tcp_listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
|
|
|
|
|
- == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error allocating socket stream listener, %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( g_network_status.tcp_listener =
|
|
|
|
|
+ socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) )
|
|
|
|
|
+ == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("error allocating socket stream listener, %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int set_socket_option_value = 1; //Represents true for used set socket options
|
|
int set_socket_option_value = 1; //Represents true for used set socket options
|
|
|
/* Activates address reuse */
|
|
/* Activates address reuse */
|
|
|
- if (setsockopt(g_network_status.tcp_listener, SOL_SOCKET, SO_REUSEADDR,
|
|
|
|
|
- (char *) &set_socket_option_value,
|
|
|
|
|
- sizeof(set_socket_option_value)) == -1) {
|
|
|
|
|
|
|
+ if (setsockopt( g_network_status.tcp_listener, SOL_SOCKET, SO_REUSEADDR,
|
|
|
|
|
+ (char *) &set_socket_option_value,
|
|
|
|
|
+ sizeof(set_socket_option_value) ) == -1) {
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "error setting socket option SO_REUSEADDR on tcp_listener\n");
|
|
|
|
|
|
|
+ "error setting socket option SO_REUSEADDR on tcp_listener\n");
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* create a new UDP socket */
|
|
/* create a new UDP socket */
|
|
|
- if ((g_network_status.udp_global_broadcast_listener = socket(AF_INET,
|
|
|
|
|
- SOCK_DGRAM,
|
|
|
|
|
- IPPROTO_UDP))
|
|
|
|
|
- == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error allocating UDP global broadcast listener socket, %d - %s\n",
|
|
|
|
|
- error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( g_network_status.udp_global_broadcast_listener = socket(AF_INET,
|
|
|
|
|
+ SOCK_DGRAM,
|
|
|
|
|
+ IPPROTO_UDP) )
|
|
|
|
|
+ == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "error allocating UDP global broadcast listener socket, %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* create a new UDP socket */
|
|
/* create a new UDP socket */
|
|
|
- if ((g_network_status.udp_unicast_listener = socket(AF_INET, SOCK_DGRAM,
|
|
|
|
|
- IPPROTO_UDP)) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
|
|
+ if ( ( g_network_status.udp_unicast_listener = socket(AF_INET, SOCK_DGRAM,
|
|
|
|
|
+ IPPROTO_UDP) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
OPENER_TRACE_ERR("error allocating UDP unicast listener socket, %d - %s\n",
|
|
OPENER_TRACE_ERR("error allocating UDP unicast listener socket, %d - %s\n",
|
|
|
- error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ error_code, error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Activates address reuse */
|
|
/* Activates address reuse */
|
|
|
- if (setsockopt(g_network_status.udp_global_broadcast_listener, SOL_SOCKET,
|
|
|
|
|
- SO_REUSEADDR, (char *) &set_socket_option_value,
|
|
|
|
|
- sizeof(set_socket_option_value)) == -1) {
|
|
|
|
|
|
|
+ if (setsockopt( g_network_status.udp_global_broadcast_listener, SOL_SOCKET,
|
|
|
|
|
+ SO_REUSEADDR, (char *) &set_socket_option_value,
|
|
|
|
|
+ sizeof(set_socket_option_value) ) == -1) {
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "error setting socket option SO_REUSEADDR on udp_broadcast_listener\n");
|
|
|
|
|
|
|
+ "error setting socket option SO_REUSEADDR on udp_broadcast_listener\n");
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Activates address reuse */
|
|
/* Activates address reuse */
|
|
|
- if (setsockopt(g_network_status.udp_unicast_listener, SOL_SOCKET,
|
|
|
|
|
- SO_REUSEADDR, (char *) &set_socket_option_value,
|
|
|
|
|
- sizeof(set_socket_option_value)) == -1) {
|
|
|
|
|
|
|
+ if (setsockopt( g_network_status.udp_unicast_listener, SOL_SOCKET,
|
|
|
|
|
+ SO_REUSEADDR, (char *) &set_socket_option_value,
|
|
|
|
|
+ sizeof(set_socket_option_value) ) == -1) {
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "error setting socket option SO_REUSEADDR on udp_unicast_listener\n");
|
|
|
|
|
|
|
+ "error setting socket option SO_REUSEADDR on udp_unicast_listener\n");
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct sockaddr_in my_address = { .sin_family = AF_INET, .sin_port = htons(
|
|
struct sockaddr_in my_address = { .sin_family = AF_INET, .sin_port = htons(
|
|
|
- kOpenerEthernetPort), .sin_addr.s_addr = interface_configuration_
|
|
|
|
|
- .ip_address };
|
|
|
|
|
|
|
+ kOpenerEthernetPort),
|
|
|
|
|
+ .sin_addr.s_addr = interface_configuration_
|
|
|
|
|
+ .
|
|
|
|
|
+ ip_address };
|
|
|
|
|
|
|
|
/* bind the new socket to port 0xAF12 (CIP) */
|
|
/* bind the new socket to port 0xAF12 (CIP) */
|
|
|
- if ((bind(g_network_status.tcp_listener, (struct sockaddr *) &my_address,
|
|
|
|
|
- sizeof(struct sockaddr))) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error with TCP bind: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( bind( g_network_status.tcp_listener, (struct sockaddr *) &my_address,
|
|
|
|
|
+ sizeof(struct sockaddr) ) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("error with TCP bind: %d - %s\n", error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ((bind(g_network_status.udp_unicast_listener,
|
|
|
|
|
- (struct sockaddr *) &my_address, sizeof(struct sockaddr))) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error with UDP unicast bind: %d - %s\n", error_code, GetErrorMessage(error_code));
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( bind( g_network_status.udp_unicast_listener,
|
|
|
|
|
+ (struct sockaddr *) &my_address,
|
|
|
|
|
+ sizeof(struct sockaddr) ) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR( "error with UDP unicast bind: %d - %s\n", error_code, GetErrorMessage(
|
|
|
|
|
+ error_code) );
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct sockaddr_in global_broadcast_address = { .sin_family = AF_INET,
|
|
struct sockaddr_in global_broadcast_address = { .sin_family = AF_INET,
|
|
|
- .sin_port = htons(kOpenerEthernetPort), .sin_addr.s_addr= htonl(INADDR_ANY) };
|
|
|
|
|
|
|
+ .sin_port = htons(
|
|
|
|
|
+ kOpenerEthernetPort),
|
|
|
|
|
+ .sin_addr.s_addr = htonl(
|
|
|
|
|
+ INADDR_ANY) };
|
|
|
|
|
|
|
|
/* enable the UDP socket to receive broadcast messages */
|
|
/* enable the UDP socket to receive broadcast messages */
|
|
|
- if (0
|
|
|
|
|
- > setsockopt(g_network_status.udp_global_broadcast_listener, SOL_SOCKET, SO_BROADCAST,
|
|
|
|
|
- (char *) &set_socket_option_value, sizeof(int))) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR(
|
|
|
|
|
- "error with setting broadcast receive for UDP socket: %d - %s\n",
|
|
|
|
|
- error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
- return kEipStatusError;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ((bind(g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
- (struct sockaddr *) &global_broadcast_address,
|
|
|
|
|
- sizeof(struct sockaddr))) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error with global broadcast UDP bind: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( 0
|
|
|
|
|
+ > setsockopt( g_network_status.udp_global_broadcast_listener, SOL_SOCKET,
|
|
|
|
|
+ SO_BROADCAST,
|
|
|
|
|
+ (char *) &set_socket_option_value, sizeof(int) ) ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "error with setting broadcast receive for UDP socket: %d - %s\n",
|
|
|
|
|
+ error_code, error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
|
|
+ return kEipStatusError;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ( ( bind( g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
+ (struct sockaddr *) &global_broadcast_address,
|
|
|
|
|
+ sizeof(struct sockaddr) ) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("error with global broadcast UDP bind: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* switch socket in listen mode */
|
|
/* switch socket in listen mode */
|
|
|
- if ((listen(g_network_status.tcp_listener, MAX_NO_OF_TCP_SOCKETS)) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error with listen: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( listen(g_network_status.tcp_listener,
|
|
|
|
|
+ MAX_NO_OF_TCP_SOCKETS) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error with listen: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -190,10 +209,10 @@ EipStatus NetworkHandlerInitialize(void) {
|
|
|
|
|
|
|
|
/* keep track of the biggest file descriptor */
|
|
/* keep track of the biggest file descriptor */
|
|
|
highest_socket_handle = GetMaxSocket(
|
|
highest_socket_handle = GetMaxSocket(
|
|
|
- g_network_status.tcp_listener,
|
|
|
|
|
- g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
- 0,
|
|
|
|
|
- g_network_status.udp_unicast_listener);
|
|
|
|
|
|
|
+ g_network_status.tcp_listener,
|
|
|
|
|
+ g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
+ 0,
|
|
|
|
|
+ g_network_status.udp_unicast_listener);
|
|
|
|
|
|
|
|
g_last_time = GetMilliSeconds(); /* initialize time keeping */
|
|
g_last_time = GetMilliSeconds(); /* initialize time keeping */
|
|
|
g_network_status.elapsed_time = 0;
|
|
g_network_status.elapsed_time = 0;
|
|
@@ -211,8 +230,8 @@ void IApp_CloseSocket_tcp(int socket_handle) {
|
|
|
|
|
|
|
|
EipBool8 CheckSocketSet(int socket) {
|
|
EipBool8 CheckSocketSet(int socket) {
|
|
|
EipBool8 return_value = false;
|
|
EipBool8 return_value = false;
|
|
|
- if (FD_ISSET(socket, &read_socket)) {
|
|
|
|
|
- if (FD_ISSET(socket, &master_socket)) {
|
|
|
|
|
|
|
+ if ( FD_ISSET(socket, &read_socket) ) {
|
|
|
|
|
+ if ( FD_ISSET(socket, &master_socket) ) {
|
|
|
return_value = true;
|
|
return_value = true;
|
|
|
} else {
|
|
} else {
|
|
|
OPENER_TRACE_INFO("socket: %d closed with pending message\n", socket);
|
|
OPENER_TRACE_INFO("socket: %d closed with pending message\n", socket);
|
|
@@ -226,16 +245,16 @@ EipBool8 CheckSocketSet(int socket) {
|
|
|
void CheckAndHandleTcpListenerSocket(void) {
|
|
void CheckAndHandleTcpListenerSocket(void) {
|
|
|
int new_socket;
|
|
int new_socket;
|
|
|
/* see if this is a connection request to the TCP listener*/
|
|
/* see if this is a connection request to the TCP listener*/
|
|
|
- if (true == CheckSocketSet(g_network_status.tcp_listener)) {
|
|
|
|
|
|
|
+ if ( true == CheckSocketSet(g_network_status.tcp_listener) ) {
|
|
|
OPENER_TRACE_INFO("networkhandler: new TCP connection\n");
|
|
OPENER_TRACE_INFO("networkhandler: new TCP connection\n");
|
|
|
|
|
|
|
|
new_socket = accept(g_network_status.tcp_listener, NULL, NULL);
|
|
new_socket = accept(g_network_status.tcp_listener, NULL, NULL);
|
|
|
if (new_socket == -1) {
|
|
if (new_socket == -1) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
OPENER_TRACE_ERR("networkhandler: error on accept: %d - %s\n",
|
|
OPENER_TRACE_ERR("networkhandler: error on accept: %d - %s\n",
|
|
|
error_code, error_message);
|
|
error_code, error_message);
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ free(error_message);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -256,9 +275,9 @@ EipStatus NetworkHandlerProcessOnce(void) {
|
|
|
|
|
|
|
|
g_time_value.tv_sec = 0;
|
|
g_time_value.tv_sec = 0;
|
|
|
g_time_value.tv_usec = (
|
|
g_time_value.tv_usec = (
|
|
|
- g_network_status.elapsed_time < kOpenerTimerTickInMilliSeconds ?
|
|
|
|
|
- kOpenerTimerTickInMilliSeconds - g_network_status.elapsed_time : 0)
|
|
|
|
|
- * 1000; /* 10 ms */
|
|
|
|
|
|
|
+ g_network_status.elapsed_time < kOpenerTimerTickInMilliSeconds ?
|
|
|
|
|
+ kOpenerTimerTickInMilliSeconds - g_network_status.elapsed_time : 0)
|
|
|
|
|
+ * 1000; /* 10 ms */
|
|
|
|
|
|
|
|
int ready_socket = select(highest_socket_handle + 1, &read_socket, 0, 0,
|
|
int ready_socket = select(highest_socket_handle + 1, &read_socket, 0, 0,
|
|
|
&g_time_value);
|
|
&g_time_value);
|
|
@@ -268,10 +287,12 @@ EipStatus NetworkHandlerProcessOnce(void) {
|
|
|
{
|
|
{
|
|
|
return kEipStatusOk;
|
|
return kEipStatusOk;
|
|
|
} else {
|
|
} else {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error with select: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error with select: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -284,9 +305,9 @@ EipStatus NetworkHandlerProcessOnce(void) {
|
|
|
CheckAndHandleConsumingUdpSockets();
|
|
CheckAndHandleConsumingUdpSockets();
|
|
|
|
|
|
|
|
for (int socket = 0; socket <= highest_socket_handle; socket++) {
|
|
for (int socket = 0; socket <= highest_socket_handle; socket++) {
|
|
|
- if (true == CheckSocketSet(socket)) {
|
|
|
|
|
|
|
+ if ( true == CheckSocketSet(socket) ) {
|
|
|
/* if it is still checked it is a TCP receive */
|
|
/* if it is still checked it is a TCP receive */
|
|
|
- if (kEipStatusError == HandleDataOnTcpSocket(socket)) /* if error */
|
|
|
|
|
|
|
+ if ( kEipStatusError == HandleDataOnTcpSocket(socket) ) /* if error */
|
|
|
{
|
|
{
|
|
|
CloseSocket(socket);
|
|
CloseSocket(socket);
|
|
|
CloseSession(socket); /* clean up session and close the socket */
|
|
CloseSession(socket); /* clean up session and close the socket */
|
|
@@ -323,12 +344,13 @@ void CheckAndHandleUdpGlobalBroadcastSocket(void) {
|
|
|
socklen_t from_address_length;
|
|
socklen_t from_address_length;
|
|
|
|
|
|
|
|
/* see if this is an unsolicited inbound UDP message */
|
|
/* see if this is an unsolicited inbound UDP message */
|
|
|
- if (true == CheckSocketSet(g_network_status.udp_global_broadcast_listener)) {
|
|
|
|
|
|
|
+ if ( true ==
|
|
|
|
|
+ CheckSocketSet(g_network_status.udp_global_broadcast_listener) ) {
|
|
|
|
|
|
|
|
from_address_length = sizeof(from_address);
|
|
from_address_length = sizeof(from_address);
|
|
|
|
|
|
|
|
OPENER_TRACE_STATE(
|
|
OPENER_TRACE_STATE(
|
|
|
- "networkhandler: unsolicited UDP message on EIP global broadcast socket\n");
|
|
|
|
|
|
|
+ "networkhandler: unsolicited UDP message on EIP global broadcast socket\n");
|
|
|
|
|
|
|
|
/* Handle UDP broadcast messages */
|
|
/* Handle UDP broadcast messages */
|
|
|
int received_size = recvfrom(g_network_status.udp_global_broadcast_listener,
|
|
int received_size = recvfrom(g_network_status.udp_global_broadcast_listener,
|
|
@@ -338,11 +360,13 @@ void CheckAndHandleUdpGlobalBroadcastSocket(void) {
|
|
|
&from_address_length);
|
|
&from_address_length);
|
|
|
|
|
|
|
|
if (received_size <= 0) { /* got error */
|
|
if (received_size <= 0) { /* got error */
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "networkhandler: error on recvfrom UDP global broadcast port: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ "networkhandler: error on recvfrom UDP global broadcast port: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -352,8 +376,8 @@ void CheckAndHandleUdpGlobalBroadcastSocket(void) {
|
|
|
int remaining_bytes = 0;
|
|
int remaining_bytes = 0;
|
|
|
do {
|
|
do {
|
|
|
int reply_length = HandleReceivedExplictUdpData(
|
|
int reply_length = HandleReceivedExplictUdpData(
|
|
|
- g_network_status.udp_global_broadcast_listener, &from_address,
|
|
|
|
|
- receive_buffer, received_size, &remaining_bytes, false);
|
|
|
|
|
|
|
+ g_network_status.udp_global_broadcast_listener, &from_address,
|
|
|
|
|
+ receive_buffer, received_size, &remaining_bytes, false);
|
|
|
|
|
|
|
|
receive_buffer += received_size - remaining_bytes;
|
|
receive_buffer += received_size - remaining_bytes;
|
|
|
received_size = remaining_bytes;
|
|
received_size = remaining_bytes;
|
|
@@ -362,12 +386,12 @@ void CheckAndHandleUdpGlobalBroadcastSocket(void) {
|
|
|
OPENER_TRACE_INFO("reply sent:\n");
|
|
OPENER_TRACE_INFO("reply sent:\n");
|
|
|
|
|
|
|
|
/* if the active socket matches a registered UDP callback, handle a UDP packet */
|
|
/* if the active socket matches a registered UDP callback, handle a UDP packet */
|
|
|
- if (sendto(g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
- (char *) g_ethernet_communication_buffer, reply_length, 0,
|
|
|
|
|
- (struct sockaddr *) &from_address, sizeof(from_address))
|
|
|
|
|
|
|
+ if (sendto( g_network_status.udp_global_broadcast_listener,
|
|
|
|
|
+ (char *) g_ethernet_communication_buffer, reply_length, 0,
|
|
|
|
|
+ (struct sockaddr *) &from_address, sizeof(from_address) )
|
|
|
!= reply_length) {
|
|
!= reply_length) {
|
|
|
OPENER_TRACE_INFO(
|
|
OPENER_TRACE_INFO(
|
|
|
- "networkhandler: UDP response was not fully sent\n");
|
|
|
|
|
|
|
+ "networkhandler: UDP response was not fully sent\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} while (remaining_bytes > 0);
|
|
} while (remaining_bytes > 0);
|
|
@@ -380,12 +404,12 @@ void CheckAndHandleUdpUnicastSocket(void) {
|
|
|
socklen_t from_address_length;
|
|
socklen_t from_address_length;
|
|
|
|
|
|
|
|
/* see if this is an unsolicited inbound UDP message */
|
|
/* see if this is an unsolicited inbound UDP message */
|
|
|
- if (true == CheckSocketSet(g_network_status.udp_unicast_listener)) {
|
|
|
|
|
|
|
+ if ( true == CheckSocketSet(g_network_status.udp_unicast_listener) ) {
|
|
|
|
|
|
|
|
from_address_length = sizeof(from_address);
|
|
from_address_length = sizeof(from_address);
|
|
|
|
|
|
|
|
OPENER_TRACE_STATE(
|
|
OPENER_TRACE_STATE(
|
|
|
- "networkhandler: unsolicited UDP message on EIP unicast socket\n");
|
|
|
|
|
|
|
+ "networkhandler: unsolicited UDP message on EIP unicast socket\n");
|
|
|
|
|
|
|
|
/* Handle UDP broadcast messages */
|
|
/* Handle UDP broadcast messages */
|
|
|
int received_size = recvfrom(g_network_status.udp_unicast_listener,
|
|
int received_size = recvfrom(g_network_status.udp_unicast_listener,
|
|
@@ -395,11 +419,13 @@ void CheckAndHandleUdpUnicastSocket(void) {
|
|
|
&from_address_length);
|
|
&from_address_length);
|
|
|
|
|
|
|
|
if (received_size <= 0) { /* got error */
|
|
if (received_size <= 0) { /* got error */
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR(
|
|
|
|
|
- "networkhandler: error on recvfrom UDP unicast port: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "networkhandler: error on recvfrom UDP unicast port: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -409,8 +435,8 @@ void CheckAndHandleUdpUnicastSocket(void) {
|
|
|
int remaining_bytes = 0;
|
|
int remaining_bytes = 0;
|
|
|
do {
|
|
do {
|
|
|
int reply_length = HandleReceivedExplictUdpData(
|
|
int reply_length = HandleReceivedExplictUdpData(
|
|
|
- g_network_status.udp_unicast_listener, &from_address, receive_buffer,
|
|
|
|
|
- received_size, &remaining_bytes, true);
|
|
|
|
|
|
|
+ g_network_status.udp_unicast_listener, &from_address, receive_buffer,
|
|
|
|
|
+ received_size, &remaining_bytes, true);
|
|
|
|
|
|
|
|
receive_buffer += received_size - remaining_bytes;
|
|
receive_buffer += received_size - remaining_bytes;
|
|
|
received_size = remaining_bytes;
|
|
received_size = remaining_bytes;
|
|
@@ -419,36 +445,42 @@ void CheckAndHandleUdpUnicastSocket(void) {
|
|
|
OPENER_TRACE_INFO("reply sent:\n");
|
|
OPENER_TRACE_INFO("reply sent:\n");
|
|
|
|
|
|
|
|
/* if the active socket matches a registered UDP callback, handle a UDP packet */
|
|
/* if the active socket matches a registered UDP callback, handle a UDP packet */
|
|
|
- if (sendto(g_network_status.udp_unicast_listener,
|
|
|
|
|
- (char *) g_ethernet_communication_buffer, reply_length, 0,
|
|
|
|
|
- (struct sockaddr *) &from_address, sizeof(from_address))
|
|
|
|
|
|
|
+ if (sendto( g_network_status.udp_unicast_listener,
|
|
|
|
|
+ (char *) g_ethernet_communication_buffer, reply_length, 0,
|
|
|
|
|
+ (struct sockaddr *) &from_address, sizeof(from_address) )
|
|
|
!= reply_length) {
|
|
!= reply_length) {
|
|
|
OPENER_TRACE_INFO(
|
|
OPENER_TRACE_INFO(
|
|
|
- "networkhandler: UDP unicast response was not fully sent\n");
|
|
|
|
|
|
|
+ "networkhandler: UDP unicast response was not fully sent\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} while (remaining_bytes > 0);
|
|
} while (remaining_bytes > 0);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-EipStatus SendUdpData(struct sockaddr_in *address, int socket, EipUint8 *data,
|
|
|
|
|
|
|
+EipStatus SendUdpData(struct sockaddr_in *address,
|
|
|
|
|
+ int socket,
|
|
|
|
|
+ EipUint8 *data,
|
|
|
EipUint16 data_length) {
|
|
EipUint16 data_length) {
|
|
|
|
|
|
|
|
- int sent_length = sendto(socket, (char *) data, data_length, 0,
|
|
|
|
|
- (struct sockaddr *) address, sizeof(*address));
|
|
|
|
|
|
|
+ int sent_length = sendto( socket, (char *) data, data_length, 0,
|
|
|
|
|
+ (struct sockaddr *) address, sizeof(*address) );
|
|
|
|
|
|
|
|
if (sent_length < 0) {
|
|
if (sent_length < 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error with sendto in sendUDPData: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "networkhandler: error with sendto in sendUDPData: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sent_length != data_length) {
|
|
if (sent_length != data_length) {
|
|
|
OPENER_TRACE_WARN(
|
|
OPENER_TRACE_WARN(
|
|
|
- "data length sent_length mismatch; probably not all data was sent in SendUdpData, sent %d of %d\n",
|
|
|
|
|
- sent_length, data_length);
|
|
|
|
|
|
|
+ "data length sent_length mismatch; probably not all data was sent in SendUdpData, sent %d of %d\n",
|
|
|
|
|
+ sent_length,
|
|
|
|
|
+ data_length);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -461,36 +493,40 @@ EipStatus HandleDataOnTcpSocket(int socket) {
|
|
|
|
|
|
|
|
/* We will handle just one EIP packet here the rest is done by the select
|
|
/* We will handle just one EIP packet here the rest is done by the select
|
|
|
* method which will inform us if more data is available in the socket
|
|
* method which will inform us if more data is available in the socket
|
|
|
- because of the current implementation of the main loop this may not be
|
|
|
|
|
- the fastest way and a loop here with a non blocking socket would better
|
|
|
|
|
- fit*/
|
|
|
|
|
|
|
+ because of the current implementation of the main loop this may not be
|
|
|
|
|
+ the fastest way and a loop here with a non blocking socket would better
|
|
|
|
|
+ fit*/
|
|
|
|
|
|
|
|
/*Check how many data is here -- read the first four bytes from the connection */
|
|
/*Check how many data is here -- read the first four bytes from the connection */
|
|
|
long number_of_read_bytes = recv(socket, g_ethernet_communication_buffer, 4,
|
|
long number_of_read_bytes = recv(socket, g_ethernet_communication_buffer, 4,
|
|
|
0); /*TODO we may have to set the socket to a non blocking socket */
|
|
0); /*TODO we may have to set the socket to a non blocking socket */
|
|
|
|
|
|
|
|
if (number_of_read_bytes == 0) {
|
|
if (number_of_read_bytes == 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
if (number_of_read_bytes < 0) {
|
|
if (number_of_read_bytes < 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const EipUint8 *read_buffer = &g_ethernet_communication_buffer[2]; /* at this place EIP stores the data length */
|
|
const EipUint8 *read_buffer = &g_ethernet_communication_buffer[2]; /* at this place EIP stores the data length */
|
|
|
size_t data_size = GetIntFromMessage(&read_buffer)
|
|
size_t data_size = GetIntFromMessage(&read_buffer)
|
|
|
- + ENCAPSULATION_HEADER_LENGTH - 4; /* -4 is for the 4 bytes we have already read*/
|
|
|
|
|
|
|
+ + ENCAPSULATION_HEADER_LENGTH - 4; /* -4 is for the 4 bytes we have already read*/
|
|
|
/* (NOTE this advances the buffer pointer) */
|
|
/* (NOTE this advances the buffer pointer) */
|
|
|
- if ((PC_OPENER_ETHERNET_BUFFER_SIZE - 4) < data_size) { /*TODO can this be handled in a better way?*/
|
|
|
|
|
|
|
+ if ( (PC_OPENER_ETHERNET_BUFFER_SIZE - 4) < data_size ) { /*TODO can this be handled in a better way?*/
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "too large packet received will be ignored, will drop the data\n");
|
|
|
|
|
|
|
+ "too large packet received will be ignored, will drop the data\n");
|
|
|
/* Currently we will drop the whole packet */
|
|
/* Currently we will drop the whole packet */
|
|
|
|
|
|
|
|
do {
|
|
do {
|
|
@@ -499,21 +535,26 @@ EipStatus HandleDataOnTcpSocket(int socket) {
|
|
|
|
|
|
|
|
if (number_of_read_bytes == 0) /* got error or connection closed by client */
|
|
if (number_of_read_bytes == 0) /* got error or connection closed by client */
|
|
|
{
|
|
{
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "networkhandler: connection closed by client: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
if (number_of_read_bytes < 0) {
|
|
if (number_of_read_bytes < 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
data_size -= number_of_read_bytes;
|
|
data_size -= number_of_read_bytes;
|
|
|
- if ((data_size < PC_OPENER_ETHERNET_BUFFER_SIZE) && (data_size != 0)) {
|
|
|
|
|
|
|
+ if ( (data_size < PC_OPENER_ETHERNET_BUFFER_SIZE) && (data_size != 0) ) {
|
|
|
data_sent = data_size;
|
|
data_sent = data_size;
|
|
|
}
|
|
}
|
|
|
} while (0 < data_size);
|
|
} while (0 < data_size);
|
|
@@ -526,21 +567,25 @@ EipStatus HandleDataOnTcpSocket(int socket) {
|
|
|
|
|
|
|
|
if (number_of_read_bytes == 0) /* got error or connection closed by client */
|
|
if (number_of_read_bytes == 0) /* got error or connection closed by client */
|
|
|
{
|
|
{
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
if (number_of_read_bytes < 0) {
|
|
if (number_of_read_bytes < 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ((unsigned) number_of_read_bytes == data_size) {
|
|
|
|
|
|
|
+ if ( (unsigned) number_of_read_bytes == data_size ) {
|
|
|
/*we got the right amount of data */
|
|
/*we got the right amount of data */
|
|
|
data_size += 4;
|
|
data_size += 4;
|
|
|
/*TODO handle partial packets*/
|
|
/*TODO handle partial packets*/
|
|
@@ -549,14 +594,14 @@ EipStatus HandleDataOnTcpSocket(int socket) {
|
|
|
g_current_active_tcp_socket = socket;
|
|
g_current_active_tcp_socket = socket;
|
|
|
|
|
|
|
|
number_of_read_bytes = HandleReceivedExplictTcpData(
|
|
number_of_read_bytes = HandleReceivedExplictTcpData(
|
|
|
- socket, g_ethernet_communication_buffer, data_size, &remaining_bytes);
|
|
|
|
|
|
|
+ socket, g_ethernet_communication_buffer, data_size, &remaining_bytes);
|
|
|
|
|
|
|
|
g_current_active_tcp_socket = -1;
|
|
g_current_active_tcp_socket = -1;
|
|
|
|
|
|
|
|
if (remaining_bytes != 0) {
|
|
if (remaining_bytes != 0) {
|
|
|
OPENER_TRACE_WARN(
|
|
OPENER_TRACE_WARN(
|
|
|
- "Warning: received packet was to long: %d Bytes left!\n",
|
|
|
|
|
- remaining_bytes);
|
|
|
|
|
|
|
+ "Warning: received packet was to long: %d Bytes left!\n",
|
|
|
|
|
+ remaining_bytes);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (number_of_read_bytes > 0) {
|
|
if (number_of_read_bytes > 0) {
|
|
@@ -596,11 +641,13 @@ int CreateUdpSocket(UdpCommuncationDirection communication_direction,
|
|
|
|
|
|
|
|
peer_address_length = sizeof(struct sockaddr_in);
|
|
peer_address_length = sizeof(struct sockaddr_in);
|
|
|
/* create a new UDP socket */
|
|
/* create a new UDP socket */
|
|
|
- if ((new_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: cannot create UDP socket: %d- %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( new_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: cannot create UDP socket: %d- %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipInvalidSocket;
|
|
return kEipInvalidSocket;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -609,20 +656,22 @@ int CreateUdpSocket(UdpCommuncationDirection communication_direction,
|
|
|
/* check if it is sending or receiving */
|
|
/* check if it is sending or receiving */
|
|
|
if (communication_direction == kUdpCommuncationDirectionConsuming) {
|
|
if (communication_direction == kUdpCommuncationDirectionConsuming) {
|
|
|
int option_value = 1;
|
|
int option_value = 1;
|
|
|
- if (setsockopt(new_socket, SOL_SOCKET, SO_REUSEADDR, (char *) &option_value,
|
|
|
|
|
- sizeof(option_value)) == -1) {
|
|
|
|
|
|
|
+ if (setsockopt( new_socket, SOL_SOCKET, SO_REUSEADDR,
|
|
|
|
|
+ (char *) &option_value,
|
|
|
|
|
+ sizeof(option_value) ) == -1) {
|
|
|
OPENER_TRACE_ERR(
|
|
OPENER_TRACE_ERR(
|
|
|
- "error setting socket option SO_REUSEADDR on consuming udp socket\n");
|
|
|
|
|
|
|
+ "error setting socket option SO_REUSEADDR on consuming udp socket\n");
|
|
|
return kEipStatusError;
|
|
return kEipStatusError;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* bind is only for consuming necessary */
|
|
/* bind is only for consuming necessary */
|
|
|
- if ((bind(new_socket, (struct sockaddr *) socket_data,
|
|
|
|
|
- sizeof(struct sockaddr))) == -1) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("error on bind udp: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( ( bind( new_socket, (struct sockaddr *) socket_data,
|
|
|
|
|
+ sizeof(struct sockaddr) ) ) == -1 ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("error on bind udp: %d - %s\n", error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipInvalidSocket;
|
|
return kEipInvalidSocket;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -632,31 +681,33 @@ int CreateUdpSocket(UdpCommuncationDirection communication_direction,
|
|
|
if (socket_data->sin_addr.s_addr
|
|
if (socket_data->sin_addr.s_addr
|
|
|
== g_multicast_configuration.starting_multicast_address) {
|
|
== g_multicast_configuration.starting_multicast_address) {
|
|
|
if (1 != g_time_to_live_value) { /* we need to set a TTL value for the socket */
|
|
if (1 != g_time_to_live_value) { /* we need to set a TTL value for the socket */
|
|
|
- if (setsockopt(new_socket, IPPROTO_IP, IP_MULTICAST_TTL,
|
|
|
|
|
- &g_time_to_live_value,
|
|
|
|
|
- sizeof(g_time_to_live_value) < 0)) {
|
|
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR(
|
|
|
|
|
- "networkhandler: could not set the TTL to: %d, error: %d - %s\n",
|
|
|
|
|
- g_time_to_live_value, error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ if ( setsockopt(new_socket, IPPROTO_IP, IP_MULTICAST_TTL,
|
|
|
|
|
+ &g_time_to_live_value,
|
|
|
|
|
+ sizeof(g_time_to_live_value) < 0) ) {
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR(
|
|
|
|
|
+ "networkhandler: could not set the TTL to: %d, error: %d - %s\n",
|
|
|
|
|
+ g_time_to_live_value, error_code, error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipInvalidSocket;
|
|
return kEipInvalidSocket;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ((communication_direction == kUdpCommuncationDirectionConsuming)
|
|
|
|
|
- || (0 == socket_data->sin_addr.s_addr)) {
|
|
|
|
|
|
|
+ if ( (communication_direction == kUdpCommuncationDirectionConsuming)
|
|
|
|
|
+ || (0 == socket_data->sin_addr.s_addr) ) {
|
|
|
/* we have a peer to peer producer or a consuming connection*/
|
|
/* we have a peer to peer producer or a consuming connection*/
|
|
|
if (getpeername(g_current_active_tcp_socket,
|
|
if (getpeername(g_current_active_tcp_socket,
|
|
|
(struct sockaddr *) &peer_address, &peer_address_length)
|
|
(struct sockaddr *) &peer_address, &peer_address_length)
|
|
|
< 0) {
|
|
< 0) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: could not get peername: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: could not get peername: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
return kEipInvalidSocket;
|
|
return kEipInvalidSocket;
|
|
|
}
|
|
}
|
|
|
/* store the originators address */
|
|
/* store the originators address */
|
|
@@ -682,32 +733,36 @@ void CheckAndHandleConsumingUdpSockets(void) {
|
|
|
while (NULL != connection_object_iterator) {
|
|
while (NULL != connection_object_iterator) {
|
|
|
current_connection_object = connection_object_iterator;
|
|
current_connection_object = connection_object_iterator;
|
|
|
connection_object_iterator = connection_object_iterator
|
|
connection_object_iterator = connection_object_iterator
|
|
|
- ->next_connection_object; /* do this at the beginning as the close function may can make the entry invalid */
|
|
|
|
|
-
|
|
|
|
|
- if ((-1
|
|
|
|
|
- != current_connection_object->socket[kUdpCommuncationDirectionConsuming])
|
|
|
|
|
- && (true
|
|
|
|
|
- == CheckSocketSet(
|
|
|
|
|
- current_connection_object->socket[kUdpCommuncationDirectionConsuming]))) {
|
|
|
|
|
|
|
+ ->next_connection_object; /* do this at the beginning as the close function may can make the entry invalid */
|
|
|
|
|
+
|
|
|
|
|
+ if ( (-1
|
|
|
|
|
+ != current_connection_object->socket[
|
|
|
|
|
+ kUdpCommuncationDirectionConsuming])
|
|
|
|
|
+ && ( true
|
|
|
|
|
+ == CheckSocketSet(
|
|
|
|
|
+ current_connection_object->socket[
|
|
|
|
|
+ kUdpCommuncationDirectionConsuming]) ) ) {
|
|
|
from_address_length = sizeof(from_address);
|
|
from_address_length = sizeof(from_address);
|
|
|
int received_size = recvfrom(
|
|
int received_size = recvfrom(
|
|
|
- current_connection_object->socket[kUdpCommuncationDirectionConsuming],
|
|
|
|
|
- g_ethernet_communication_buffer, PC_OPENER_ETHERNET_BUFFER_SIZE, 0,
|
|
|
|
|
- (struct sockaddr *) &from_address, &from_address_length);
|
|
|
|
|
|
|
+ current_connection_object->socket[kUdpCommuncationDirectionConsuming],
|
|
|
|
|
+ g_ethernet_communication_buffer, PC_OPENER_ETHERNET_BUFFER_SIZE, 0,
|
|
|
|
|
+ (struct sockaddr *) &from_address, &from_address_length);
|
|
|
if (0 == received_size) {
|
|
if (0 == received_size) {
|
|
|
OPENER_TRACE_STATE("connection closed by client\n");
|
|
OPENER_TRACE_STATE("connection closed by client\n");
|
|
|
current_connection_object->connection_close_function(
|
|
current_connection_object->connection_close_function(
|
|
|
- current_connection_object);
|
|
|
|
|
|
|
+ current_connection_object);
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (0 > received_size) {
|
|
if (0 > received_size) {
|
|
|
- int error_code = GetSocketErrorNumber();
|
|
|
|
|
- char* error_message = GetErrorMessage(error_code);
|
|
|
|
|
- OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n", error_code, error_message);
|
|
|
|
|
- free(error_message);
|
|
|
|
|
|
|
+ int error_code = GetSocketErrorNumber();
|
|
|
|
|
+ char *error_message = GetErrorMessage(error_code);
|
|
|
|
|
+ OPENER_TRACE_ERR("networkhandler: error on recv: %d - %s\n",
|
|
|
|
|
+ error_code,
|
|
|
|
|
+ error_message);
|
|
|
|
|
+ free(error_message);
|
|
|
current_connection_object->connection_close_function(
|
|
current_connection_object->connection_close_function(
|
|
|
- current_connection_object);
|
|
|
|
|
|
|
+ current_connection_object);
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -729,14 +784,17 @@ void CloseSocket(int socket_handle) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int GetMaxSocket(int socket1, int socket2, int socket3, int socket4) {
|
|
int GetMaxSocket(int socket1, int socket2, int socket3, int socket4) {
|
|
|
- if ((socket1 > socket2) && (socket1 > socket3) && (socket1 > socket4))
|
|
|
|
|
|
|
+ if ( (socket1 > socket2) && (socket1 > socket3) && (socket1 > socket4) ) {
|
|
|
return socket1;
|
|
return socket1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if ((socket2 > socket1) && (socket2 > socket3) && (socket2 > socket4))
|
|
|
|
|
|
|
+ if ( (socket2 > socket1) && (socket2 > socket3) && (socket2 > socket4) ) {
|
|
|
return socket2;
|
|
return socket2;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if ((socket3 > socket1) && (socket3 > socket2) && (socket3 > socket4))
|
|
|
|
|
|
|
+ if ( (socket3 > socket1) && (socket3 > socket2) && (socket3 > socket4) ) {
|
|
|
return socket3;
|
|
return socket3;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return socket4;
|
|
return socket4;
|
|
|
}
|
|
}
|