diff --git a/src/config.c b/src/config.c index 7272188..daa7d06 100644 --- a/src/config.c +++ b/src/config.c @@ -252,6 +252,8 @@ int facilities_config(void* facilities_s) { facilities->dissemination->tmc_connect = config->facilities.cpm.tmc_connected; facilities->dissemination->latitude = config->management.gps.latitude; facilities->dissemination->longitude = config->management.gps.longitude; + facilities->dissemination->int_radar = config->facilities.cpm.radar_interface; + facilities->dissemination->ip_radar = config->facilities.cpm.radar_ip; diff --git a/src/cpm.c b/src/cpm.c index 18a8619..d7f79b5 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -66,11 +66,11 @@ bool waitingIncomingConnection(void){ -bool interface_connection(char* radar_ip,char* radar_port, facilities_t* facilities){ +bool interface_connection(char* radar_port, facilities_t* facilities){ if(facilities->dissemination->tmc_connect == false){ - // 1 - Create socket + // Create socket s_socket.i32_socket = socket(AF_INET, SOCK_STREAM, 0); if(s_socket.i32_socket < 0){ @@ -78,10 +78,10 @@ bool interface_connection(char* radar_ip,char* radar_port, facilities_t* facilit return false; } - // 2 - Bind it to server address and port + // 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(radar_ip); + 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){ @@ -107,7 +107,7 @@ bool interface_connection(char* radar_ip,char* radar_port, facilities_t* facilit bzero(&raw_socket.sll, sizeof(raw_socket.sll)); bzero(&raw_socket.ifr, sizeof(raw_socket.ifr)); - strncpy((char *)raw_socket.ifr.ifr_name, INTERFACE_RADAR, IFNAMSIZ); + 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; @@ -539,20 +539,18 @@ void dissemination_reset_timer(dissemination_t* dissemination, it2s_tender_epv_t void *cp_service(void *fc){ /* Variables */ + int i32_recv_bytes; u_int8_t au8_readBuffer[READ_BUFFER_SIZE]; bool is_radar_connected; u_int8_t au8_readTcp[READ_BUFFER_SIZE]; facilities_t *facilities = (facilities_t *) fc; - - uint8_t bdr_oer[2048]; uint8_t fdi_oer[2048]; - bdr_oer[0] = 4; //Facilities + bdr_oer[0] = 4; //Facilities fdi_oer[0] = 4; - BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); FacilitiesDataIndication_t *fdi = calloc(1, sizeof(FacilitiesDataIndication_t)); @@ -568,28 +566,27 @@ void *cp_service(void *fc){ - bdr->btpType = BTPType_btpB; //BTP Type B is for non-interactive packet transport | BTP Type A is for interactive packet transport - //The former doesn't have a source port and the latter have + bdr->btpType = BTPType_btpB; //BTP Type B is for non-interactive packet transport | BTP Type A is for interactive packet transport + //The former doesn't have a source port and the latter have - bdr->destinationPort = Port_cpm; //CPM entity port for communication between Facilities and Transport - bdr->gnPacketTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet - bdr->gnTrafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport - bdr->data.buf = malloc(1500); //CPM Data to be sent to the Transport layer + bdr->destinationPort = Port_cpm; //CPM entity port for communication between Facilities and Transport + bdr->gnPacketTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet + bdr->gnTrafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport + bdr->data.buf = malloc(1500); //CPM Data to be sent to the Transport layer if(facilities->use_security) { bdr->gnSecurityProfile = malloc(sizeof(long)); *bdr->gnSecurityProfile = 1; } - is_radar_connected = interface_connection(RADAR_IP,RADAR_PORT,facilities); // Create Radar listening socket + is_radar_connected = interface_connection(RADAR_PORT,facilities); // Create Radar listening socket /*--- Fill mandatory Facilities Data Indication parameters ---*/ + fdi->itsMessageType = ItsMessageType_cpm; fdi->data.buf = malloc(1500); - - struct timespec* systemtime; systemtime = (struct timespec*)malloc(sizeof(struct timespec)); if (systemtime == NULL) { @@ -614,12 +611,33 @@ void *cp_service(void *fc){ if (dissemination_check(facilities->dissemination, &facilities->epv) && facilities->dissemination->active){ if(is_radar_connected){ + if(i32_recv_bytes <= 0){ syslog_debug("No data received from radar ..."); is_radar_connected = false; continue; } + int j = 0; + int temp_data = ((int)(au8_readBuffer[12])) >> 4; + + for(int i = temp_data;i < READ_BUFFER_SIZE; i++){ + au8_readBuffer[j] = au8_readBuffer[i]; + j++; + } + + temp_data = ((int)(au8_readBuffer[0])) & 0x0f; + + j = 0; + for(int i = temp_data;i < READ_BUFFER_SIZE; i++){ + au8_readBuffer[j] = au8_readBuffer[i]; + j++; + } + + if(i32_recv_bytes < 0){ + syslog_debug("No data received from radar ..."); + break; + } /* Information parsing */ parse_input(au8_readBuffer,i32_recv_bytes); diff --git a/src/cpm.h b/src/cpm.h index 77481d2..3a46a60 100644 --- a/src/cpm.h +++ b/src/cpm.h @@ -17,9 +17,6 @@ #define ROAD_ANGLE 120 #define MESSAGE_ID 14 #define PROTOCOL_VERSION 1 -#define INTERFACE_RADAR "enp3s0" - -#define RADAR_IP "192.168.11.1" // ITS-S interface connected to the radar #define RADAR_PORT "55555" // Destination port from the radar @@ -120,6 +117,8 @@ typedef struct bool active; bool tmc_connect; + char* int_radar; + char* ip_radar; pthread_mutex_t lock;