blob: 305ce814c03a7668df7cbd7f6abfd34acd6152bf [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000-2019 Ericsson Telecom AB
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
// Rev: <RnXnn>
// Prodnr: CNL 113 827
// Contact: http://ttcn.ericsson.se
//
///////////////////////////////////////////////////////////////////////////////
#include "GTP_ctrl_handler.h"
#include "GTP_mem_handler.h"
#include <string.h>
#include <stdio.h>
int put_int(msg_buffer* buffer ,const int data){
inc_buff_size(buffer,4);
buffer->msg[buffer->pos] = (data >> 24) & 0xff;
buffer->pos++;
buffer->msg[buffer->pos] = (data >> 16) & 0xff;
buffer->pos++;
buffer->msg[buffer->pos] = (data >> 8) & 0xff;
buffer->pos++;
buffer->msg[buffer->pos] = data & 0xff;
buffer->pos++;
return 4;
}
int get_int(msg_buffer* buffer,int* data){
if((buffer->pos + 4 ) > buffer->size){
return -1; // not enough octets in the buffer
}
*data=buffer->msg[buffer->pos];
(*data) <<= 8;
buffer->pos++;
*data+=buffer->msg[buffer->pos];
(*data) <<= 8;
buffer->pos++;
*data+=buffer->msg[buffer->pos];
(*data) <<= 8;
buffer->pos++;
*data+=buffer->msg[buffer->pos];
buffer->pos++;
return 4;
}
int put_str(msg_buffer* buffer,const str_holder* data){
int ret_val=put_int(buffer,data->str_size);
inc_buff_size(buffer,data->str_size);
memcpy(buffer->msg+buffer->pos,data->str_begin,data->str_size);
buffer->pos += data->str_size;
return ret_val + data->str_size;
}
int get_str(msg_buffer* buffer,str_holder* data){
int ret_val=-1;
int str_size;
if(get_int(buffer,&str_size)!=-1){
if((buffer->pos + str_size) <= buffer->size){
data->str_begin = buffer->msg+buffer->pos;
data->str_size = str_size;
ret_val = 4+ str_size;
buffer->pos += str_size;
}
}
return ret_val;
}
void init_msg_buffer(msg_buffer* buffer){
buffer->msg=(unsigned char*)Malloc(256*sizeof(unsigned char));
buffer->size =256;
buffer->pos =0;
}
void free_msg_buffer(msg_buffer* buffer){
Free(buffer->msg);
}
void inc_buff_size(msg_buffer* buffer,int new_size){
while((buffer->pos + new_size ) >= buffer->size){
buffer->size *=2;
buffer->msg=(unsigned char*)Realloc(buffer->msg,buffer->size);
}
}
void copy_str_holder(str_holder* target, const str_holder* source){
unsigned char* tmp=(unsigned char*)Malloc(source->str_size*sizeof(unsigned char));
memcpy(tmp,source->str_begin,source->str_size);
target->str_size=source->str_size;
target->str_begin=tmp;
}
void free_str_holder(str_holder* str){
if(str->str_size>=0){
Free((void*)str->str_begin);
}
}
int str_eq(const str_holder &lhs, const str_holder &rhs){
if(lhs.str_size == rhs.str_size){
return memcmp(lhs.str_begin,rhs.str_begin,lhs.str_size);
}
return lhs.str_size - rhs.str_size;
}