Merge branch 'master' of https://gitlab.es.av.it.pt/its/it2s-itss-facilities
This commit is contained in:
commit
da5b2cb482
140
src/cpm.c
140
src/cpm.c
|
|
@ -47,92 +47,104 @@ S_INTERFACE_CONNECTION_T raw_socket;
|
||||||
S_OBJECT_CONTROL_T s_objectControl;
|
S_OBJECT_CONTROL_T s_objectControl;
|
||||||
S_OBJECTS_T as_objects[NOF_OBJECTS];
|
S_OBJECTS_T as_objects[NOF_OBJECTS];
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
struct ifreq ifr;
|
||||||
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
|
|
||||||
bool waitingIncomingConnection(void){
|
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
|
||||||
// Listening to the socket (Waiting for incoming connection)
|
|
||||||
unsigned int len = sizeof(s_socket.s_client);
|
|
||||||
|
|
||||||
if(listen(s_socket.i32_socket,1)<0){
|
strncpy(ifr.ifr_name, facilities->dissemination->int_radar, sizeof(ifr.ifr_name));
|
||||||
syslog_err("Waiting for incoming requests failed...");
|
if(ioctl(sock, SIOCGIFFLAGS, &ifr) <0)
|
||||||
return false;
|
syslog_err(" IOCTL failed, could not retrieve radar interface flags");
|
||||||
}
|
|
||||||
|
|
||||||
if((s_socket.i32_client = accept(s_socket.i32_socket, (struct sockaddr*)&s_socket.s_server, &len)) < 0){
|
close(sock);
|
||||||
syslog_err("Client disconnected...");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
syslog_debug("Radar connected");
|
return (ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING);
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool radar_connection(char* radar_port, facilities_t* facilities){
|
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
|
if(s_socket.i32_socket < 0){
|
||||||
s_socket.i32_socket = socket(AF_INET, SOCK_STREAM, 0);
|
syslog_err("Initializing socket failed ...");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if(s_socket.i32_socket < 0){
|
// Bind it to server address and port
|
||||||
syslog_err("Initializing socket failed ...");
|
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");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind it to server address and port
|
// Get interface index
|
||||||
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){
|
bzero(&raw_socket.sll, sizeof(raw_socket.sll));
|
||||||
syslog_err("Binding socket to address error ...");
|
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 false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!waitingIncomingConnection()){
|
return true;
|
||||||
return false;
|
}else{
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
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;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dissemination_t* dissemination_init(){
|
dissemination_t* dissemination_init(){
|
||||||
|
|
@ -728,7 +740,7 @@ void *cp_service(void *fc){
|
||||||
dissemination_reset_timer(facilities->dissemination, &facilities->epv,1);
|
dissemination_reset_timer(facilities->dissemination, &facilities->epv,1);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
is_radar_connected = waitingIncomingConnection();
|
is_radar_connected = radar_connection(RADAR_PORT,facilities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue