git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7885 818b1a75-f10b-46b9-bf7c-635c3b92a50f
528 lines
10 KiB
C
528 lines
10 KiB
C
/*******************************************************************************
|
|
OpenAirInterface
|
|
Copyright(c) 1999 - 2014 Eurecom
|
|
|
|
OpenAirInterface is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
|
|
OpenAirInterface is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenAirInterface.The full GNU General Public License is
|
|
included in this distribution in the file called "COPYING". If not,
|
|
see <http://www.gnu.org/licenses/>.
|
|
|
|
Contact Information
|
|
OpenAirInterface Admin: openair_admin@eurecom.fr
|
|
OpenAirInterface Tech : openair_tech@eurecom.fr
|
|
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
|
|
|
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
|
|
|
*******************************************************************************/
|
|
|
|
/*! \file storage_traci_OMG.c
|
|
* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr)
|
|
* \author S. Uppoor
|
|
* \date 2012
|
|
* \version 0.2
|
|
* \company INRIA
|
|
* \email: sandesh.uppor@inria.fr
|
|
* \note 0.1 -> 0.2: (J. Harri) added reader and writer to String_list
|
|
* \warning
|
|
*/
|
|
|
|
|
|
#include <string.h>
|
|
#include "storage_traci_OMG.h"
|
|
|
|
//using namespace std
|
|
bool bigEndian;
|
|
|
|
|
|
void reset()
|
|
{
|
|
tracker = NULL;
|
|
head = NULL;
|
|
descLen = 0;
|
|
freeStorage(storageStart); // freeing the storage object
|
|
storageStart=NULL;
|
|
|
|
}
|
|
|
|
void check_endianness()
|
|
{
|
|
|
|
//checking endianness
|
|
un.s = 0x0102;
|
|
|
|
if (sizeof(short) == 2) {
|
|
if (un.c[0] == 1 && un.c[1] == 2)
|
|
bigEndian = true;
|
|
}
|
|
}
|
|
|
|
|
|
int storageLength(storage *cur_ptr)
|
|
{
|
|
|
|
int count=0;
|
|
|
|
while(cur_ptr != NULL) {
|
|
cur_ptr=cur_ptr->next;
|
|
count++;
|
|
}
|
|
|
|
return(count);
|
|
}
|
|
|
|
void rearange()
|
|
{
|
|
//Since linked list is used, all data is appended to the last pointer,
|
|
// we face problem in sendExact(int cmdLength) in socket_traci_OMG.c
|
|
// since total length of the entire message is appended last
|
|
// storage = command + length(4 bytes) is changed to storage = length(4 bytes) + command
|
|
int pos = msgLength - 4;
|
|
int count =0;
|
|
|
|
storage *cur_ptr = NULL;
|
|
storage *temp_ptr = NULL;
|
|
storage *temp_pptr = NULL;
|
|
|
|
cur_ptr = storageStart;
|
|
|
|
while (count != pos && cur_ptr->next != NULL) {
|
|
temp_pptr = cur_ptr;
|
|
cur_ptr = cur_ptr->next;
|
|
|
|
count++;
|
|
}
|
|
|
|
temp_ptr = cur_ptr;
|
|
|
|
while(cur_ptr->next != NULL) {
|
|
cur_ptr = cur_ptr-> next;
|
|
}
|
|
|
|
cur_ptr->next = storageStart;
|
|
storageStart = temp_ptr;
|
|
temp_pptr->next = NULL;
|
|
|
|
}
|
|
|
|
unsigned char readChar()
|
|
{
|
|
// if (tracker!=NULL)
|
|
// {
|
|
unsigned char hd = tracker->item;
|
|
//printf("OMG char: %d \n",(int)hd);
|
|
tracker = tracker->next;
|
|
return hd;
|
|
//}else
|
|
// {
|
|
// LOG_E(OMG, " Storage::readChar(): Tracker is NULL \n");
|
|
// unsigned char *error = NULL;
|
|
// return error; //
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
void writeChar(unsigned char value)
|
|
{
|
|
storage *temp;
|
|
temp = (storage *)malloc(sizeof(storage));
|
|
|
|
if (head == NULL) {
|
|
head = temp;
|
|
head->next = NULL;
|
|
head->item = value;
|
|
storageStart = temp; //points to start of actual message
|
|
} else {
|
|
head->next = temp;
|
|
temp->next = NULL;
|
|
temp->item = value;
|
|
head = temp;
|
|
}
|
|
}
|
|
|
|
int readByte()
|
|
{
|
|
int i = (int)(readChar());
|
|
|
|
if (i < 128) return i;
|
|
else return (i - 256);
|
|
|
|
}
|
|
|
|
void writeByte(int value)
|
|
{
|
|
if (value < -128 || value > 127) {
|
|
LOG_E(OMG, " Storage::writeByte(): Invalid value, not in [-128, 127]\n");
|
|
}
|
|
|
|
writeChar( (unsigned char)( (value+256) % 256 ) );
|
|
}
|
|
|
|
int readUnsignedByte()
|
|
{
|
|
|
|
return (int)(readChar());
|
|
|
|
}
|
|
|
|
|
|
void writeUnsignedByte(int value)
|
|
{
|
|
if (value < 0 || value > 255) {
|
|
LOG_E(OMG, " Storage::writeUnsignedByte(): Invalid value, not in [0, 255]\n");
|
|
}
|
|
|
|
writeChar( ((unsigned char)value));
|
|
}
|
|
|
|
// JNNOTE: had to change the behavior here, as tmp was always pointing at the end of the String and not at the beginning: accordingly, all strings where always '0'
|
|
char * readString()
|
|
{
|
|
|
|
int i=0;
|
|
int len = readInt();
|
|
|
|
descLen = len;
|
|
char *tmp = (char *)malloc(sizeof(char) * (len));
|
|
char *ret = tmp; // JHNOTE: added a pointer pointing at the head of the String
|
|
|
|
//printf("OMG ready to readString of length %d \n",len);
|
|
for (; i < len; i++) {
|
|
*tmp++ = (char) readChar();
|
|
}
|
|
|
|
*tmp++ = '\0'; // makes sure it's NUL terminated
|
|
|
|
//printf("OMG readString - %s \n",ret);
|
|
//printf("OMG readString - %s \n",tmp);
|
|
return ret; // the head is returned
|
|
|
|
}
|
|
|
|
|
|
void writeString(char *s)
|
|
{
|
|
int count=0;
|
|
char* s_copy=s;
|
|
|
|
for(; *s!='\0'; s++)
|
|
count++;
|
|
|
|
writeInt(count);
|
|
|
|
for(; *s_copy!='\0'; s_copy++)
|
|
writeChar(*s_copy);
|
|
|
|
}
|
|
|
|
string_list* readStringList(string_list* vector)
|
|
{
|
|
|
|
int i=0;
|
|
int len = readInt();
|
|
descLen = len;
|
|
string_list* entry = NULL;
|
|
|
|
for (; i < len; i++) {
|
|
if (vector->string == NULL) {
|
|
char *tmp = readString();
|
|
//printf("OMG - 1 SUMO ID: %s \n",tmp);
|
|
vector->string = tmp;//readString();
|
|
} else {
|
|
entry = (string_list*) malloc(sizeof(string_list));
|
|
char *tmp = readString();
|
|
//printf("OMG - SUMO ID: %s \n",tmp);
|
|
entry->string = tmp;//readString();
|
|
entry->next = NULL;
|
|
|
|
if(vector !=NULL) {
|
|
string_list* tmp = vector;
|
|
|
|
while (tmp->next != NULL) {
|
|
tmp = tmp->next;
|
|
}
|
|
|
|
tmp->next = entry;
|
|
}
|
|
}
|
|
}
|
|
|
|
return vector;
|
|
|
|
}
|
|
|
|
|
|
void writeStringList(string_list* vector)
|
|
{
|
|
|
|
|
|
int count=0;
|
|
string_list* tmp = vector;
|
|
|
|
// JHNote: a better solution would be to save the pointer to the reference of this Int and replace the value with count at the end....
|
|
if (tmp->string !=NULL)
|
|
count++;
|
|
|
|
while (tmp->next != NULL) {
|
|
tmp = tmp->next;
|
|
count++;
|
|
}
|
|
|
|
writeInt(count);
|
|
|
|
tmp = vector;
|
|
|
|
if (tmp->string !=NULL) {
|
|
writeString(tmp->string);
|
|
}
|
|
|
|
while (tmp->next != NULL) {
|
|
tmp = tmp->next;
|
|
writeString(tmp->string);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
int readShort()
|
|
{
|
|
LOG_W(OMG, " readShort not implented \n");
|
|
return -1;
|
|
}
|
|
|
|
void writeShort(int value)
|
|
{
|
|
LOG_W(OMG, " writeShort not implented \n");
|
|
return;
|
|
}
|
|
|
|
|
|
int readInt()
|
|
{
|
|
int value = 0;
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
// network is big endian
|
|
p_value[0] = readChar();
|
|
p_value[1] = readChar();
|
|
p_value[2] = readChar();
|
|
p_value[3] = readChar();
|
|
} else {
|
|
// network is little endian
|
|
p_value[3] = readChar();
|
|
p_value[2] = readChar();
|
|
p_value[1] = readChar();
|
|
p_value[0] = readChar();
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
void writeInt(int value)
|
|
{
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
// network is big endian
|
|
writeChar(p_value[0]);
|
|
writeChar(p_value[1]);
|
|
writeChar(p_value[2]);
|
|
writeChar(p_value[3]);
|
|
|
|
} else {
|
|
// network is little endian
|
|
|
|
writeChar(p_value[3]);
|
|
writeChar(p_value[2]);
|
|
writeChar(p_value[1]);
|
|
writeChar(p_value[0]);
|
|
}
|
|
}
|
|
|
|
float readFloat()
|
|
{
|
|
|
|
float value = 0;
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
// network is big endian
|
|
p_value[0] = readChar();
|
|
p_value[1] = readChar();
|
|
p_value[2] = readChar();
|
|
p_value[3] = readChar();
|
|
} else {
|
|
// network is big endian
|
|
p_value[3] = readChar();
|
|
p_value[2] = readChar();
|
|
p_value[1] = readChar();
|
|
p_value[0] = readChar();
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
void writeFloat(float value)
|
|
{
|
|
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
// network is big endian
|
|
writeChar(p_value[0]);
|
|
writeChar(p_value[1]);
|
|
writeChar(p_value[2]);
|
|
writeChar(p_value[3]);
|
|
} else {
|
|
// network is big endian
|
|
writeChar(p_value[3]);
|
|
writeChar(p_value[2]);
|
|
writeChar(p_value[1]);
|
|
writeChar(p_value[0]);
|
|
}
|
|
}
|
|
|
|
|
|
double readDouble()
|
|
{
|
|
|
|
double value = 0;
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
// network is big endian
|
|
int i = 0;
|
|
|
|
for (; i<8; ++i) {
|
|
p_value[i] = readChar();
|
|
}
|
|
} else {
|
|
int i=7;
|
|
|
|
// network is big endian
|
|
for (; i>=0; --i) {
|
|
p_value[i] = readChar();
|
|
}
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
void writeDouble(double value)
|
|
{
|
|
unsigned char *p_value = (unsigned char*)(&value);
|
|
|
|
if (bigEndian) {
|
|
int i=0;
|
|
|
|
// network is big endian
|
|
for (; i<8; ++i) {
|
|
writeChar(p_value[i]);
|
|
}
|
|
} else {
|
|
int i=7;
|
|
|
|
// network is big endian
|
|
for (; i>=0; --i) {
|
|
writeChar(p_value[i]);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
storage* writePacket (unsigned char* packet, int length)
|
|
{
|
|
|
|
//printf("required length is %d \n",length);
|
|
|
|
storage *recvpacket = NULL;
|
|
storage *recvpacketStart= NULL;
|
|
storage *temp_ = NULL;
|
|
|
|
int localSize = sizeof(storage);
|
|
printf("size of storage is %d bytes \n",localSize);
|
|
|
|
int i = 0;
|
|
|
|
for(; i < length; i++) {
|
|
|
|
printf("in %d round \n",i);
|
|
//storage *temp_ = (storage *)malloc(sizeof(storage));
|
|
temp_ = (storage *)malloc(sizeof(storage));
|
|
|
|
|
|
if (recvpacket == NULL) {
|
|
recvpacket = temp_;
|
|
recvpacketStart = recvpacket;
|
|
recvpacket->next = NULL;
|
|
recvpacket->item = packet[i];
|
|
} else {
|
|
temp_->next =NULL;
|
|
temp_-> item = packet[i];
|
|
recvpacket-> next = temp_;
|
|
recvpacket =temp_;
|
|
}
|
|
}
|
|
|
|
return recvpacketStart;
|
|
|
|
}
|
|
|
|
|
|
/*void writeStorage(){
|
|
LOG_W(OMG, " writeStorage not implented \n");
|
|
return;
|
|
|
|
}*/
|
|
|
|
void freeStorage(storage * freePtr)
|
|
{
|
|
|
|
storage *node,*temp;
|
|
node = freePtr; // start at the head.
|
|
|
|
while (node != NULL) { // traverse entire list.
|
|
temp = node ; // save node pointer.
|
|
node = node->next; // advance to next.
|
|
free(temp);
|
|
} // free the saved one.
|
|
|
|
freePtr = NULL; // finally, mark as empty list.
|
|
}
|
|
|
|
void reset_String_list(string_list* vector)
|
|
{
|
|
string_list* entry = vector;
|
|
string_list* tmp;
|
|
|
|
while (entry->next != NULL) {
|
|
tmp = entry;
|
|
entry = entry->next;
|
|
free(tmp);
|
|
}
|
|
|
|
vector = NULL;
|
|
}
|
|
|
|
|