diff --git a/src/cpm.c b/src/cpm.c index 2cfc5bf..fdbbf31 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -47,91 +47,103 @@ S_INTERFACE_CONNECTION_T raw_socket; S_OBJECT_CONTROL_T s_objectControl; S_OBJECTS_T as_objects[NOF_OBJECTS]; - - -bool waitingIncomingConnection(void){ - // Listening to the socket (Waiting for incoming connection) - unsigned int len = sizeof(s_socket.s_client); - - if(listen(s_socket.i32_socket,1)<0){ - syslog_err("Waiting for incoming requests failed..."); - return false; - } +int radar_ready(facilities_t* facilities){ + // Create temporary ifr struct and socket to + // check if the radar interface is running i.e if the + // radar has booted up - if((s_socket.i32_client = accept(s_socket.i32_socket, (struct sockaddr*)&s_socket.s_server, &len)) < 0){ - syslog_err("Client disconnected..."); - return false; - } - - syslog_debug("Radar connected"); + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); - return true; + int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + + strncpy(ifr.ifr_name, facilities->dissemination->int_radar, sizeof(ifr.ifr_name)); + if(ioctl(sock, SIOCGIFFLAGS, &ifr) <0) + syslog_err(" IOCTL failed, could not retrieve radar interface flags"); + + close(sock); + + return (ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING); } + bool radar_connection(char* radar_port, facilities_t* facilities){ + if(radar_ready(facilities) == 1){ + if(facilities->dissemination->tmc_connect == false){ - if(facilities->dissemination->tmc_connect == false){ + // Create TCP socket + s_socket.i32_socket = socket(AF_INET, SOCK_STREAM, 0); - // Create TCP socket - s_socket.i32_socket = socket(AF_INET, SOCK_STREAM, 0); + if(s_socket.i32_socket < 0){ + syslog_err("Initializing socket failed ..."); + return false; + } + + // Bind it to server address and port + bzero(&s_socket.s_server, sizeof(s_socket.s_server)); + s_socket.s_server.sin_family = AF_INET; + s_socket.s_server.sin_addr.s_addr = inet_addr(facilities->dissemination->ip_radar); + s_socket.s_server.sin_port = htons(atoi(radar_port)); + + if(bind(s_socket.i32_socket, (struct sockaddr*)&s_socket.s_server,sizeof(s_socket.s_server)) < 0){ + syslog_err("Binding socket to address error ..."); + return false; + } + + // Listening to the socket (Waiting for incoming connection) + unsigned int len = sizeof(s_socket.s_client); + + if(listen(s_socket.i32_socket,1)<0){ + syslog_err("Waiting for incoming requests failed..."); + return false; + } + + if((s_socket.i32_client = accept(s_socket.i32_socket, (struct sockaddr*)&s_socket.s_server, &len)) < 0){ + syslog_err("Client disconnected..."); + return false; + } + + syslog_debug("Radar connected"); + + } - if(s_socket.i32_socket < 0){ - syslog_err("Initializing socket failed ..."); + // Create RAW socket + + raw_socket.raw_fd = socket(AF_PACKET, SOCK_RAW, htons(0x0800)); + + if(raw_socket.raw_fd < 0){ + syslog_err("Failed to initializing RAW socket ..."); return false; } - - // Bind it to server address and port - bzero(&s_socket.s_server, sizeof(s_socket.s_server)); - s_socket.s_server.sin_family = AF_INET; - s_socket.s_server.sin_addr.s_addr = inet_addr(facilities->dissemination->ip_radar); - s_socket.s_server.sin_port = htons(atoi(radar_port)); - if(bind(s_socket.i32_socket, (struct sockaddr*)&s_socket.s_server,sizeof(s_socket.s_server)) < 0){ - syslog_err("Binding socket to address error ..."); + // Get interface index + + bzero(&raw_socket.sll, sizeof(raw_socket.sll)); + bzero(&raw_socket.ifr, sizeof(raw_socket.ifr)); + + strncpy((char *)raw_socket.ifr.ifr_name, facilities->dissemination->int_radar, IFNAMSIZ); + if((ioctl(raw_socket.raw_fd, SIOCGIFINDEX, &raw_socket.ifr)) == -1){ + syslog_err("Error getting interface index"); + return false; + } + + raw_socket.sll.sll_family = AF_PACKET; + raw_socket.sll.sll_ifindex = raw_socket.ifr.ifr_ifindex; + raw_socket.sll.sll_protocol = htons(0x0800); + + // Bind it to the interface + + if(bind(raw_socket.raw_fd, (struct sockaddr *)&raw_socket.sll, sizeof(raw_socket.sll))<0){ + syslog_err("Error binding RAW socket ..."); return false; } - if(!waitingIncomingConnection()){ - return false; - } - } - - // Create RAW socket - - raw_socket.raw_fd = socket(AF_PACKET, SOCK_RAW, htons(0x0800)); - - if(raw_socket.raw_fd < 0){ - syslog_err("Failed to initializing RAW socket ..."); + return true; + }else{ return false; } - - // Get interface index - - bzero(&raw_socket.sll, sizeof(raw_socket.sll)); - bzero(&raw_socket.ifr, sizeof(raw_socket.ifr)); - - strncpy((char *)raw_socket.ifr.ifr_name, facilities->dissemination->int_radar, IFNAMSIZ); - if((ioctl(raw_socket.raw_fd, SIOCGIFINDEX, &raw_socket.ifr)) == -1){ - syslog_err("Error getting interface index"); - return false; - } - - raw_socket.sll.sll_family = AF_PACKET; - raw_socket.sll.sll_ifindex = raw_socket.ifr.ifr_ifindex; - raw_socket.sll.sll_protocol = htons(0x0800); - - // Bind it to the interface - - if(bind(raw_socket.raw_fd, (struct sockaddr *)&raw_socket.sll, sizeof(raw_socket.sll))<0){ - syslog_err("Error binding RAW socket ..."); - return false; - } - - - return true; - } @@ -728,7 +740,7 @@ void *cp_service(void *fc){ dissemination_reset_timer(facilities->dissemination, &facilities->epv,1); }else{ - is_radar_connected = waitingIncomingConnection(); + is_radar_connected = radar_connection(RADAR_PORT,facilities); } } }