- Fix: avoid infinite loop on mulitcast read thread if no data to read

Pre-ci test passed

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Cedric Roux
2013-06-25 09:05:02 +00:00
commit 56c66c09aa
4111 changed files with 2133103 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
#ifeq ($(NAS_FLAG),1)
NAS_OBJS = $(OPENAIR2_TOP)/RRC/NAS/nas_config.o
NAS_OBJS += $(OPENAIR2_TOP)/RRC/NAS/rb_config.o
#endif
+385
View File
@@ -0,0 +1,385 @@
/*******************************************************************************
Eurecom OpenAirInterface 2
Copyright(c) 1999 - 2010 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope 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
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fsr/openairinterface
Address : Eurecom, 2229, route des cr��tes, 06560 Valbonne Sophia Antipolis, France
*******************************************************************************/
/*! \file nas_config.c
* \brief Configures the nasmesh interface
* \author Daniel Camara
* \date 2006-2011
* \version 0.1
* \company Eurecom
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/route.h>
#include "nas_config.h"
#include "UTIL/LOG/log.h"
//default values according to the examples,
char *baseNetAddress = "10.0" ;
char *netMask = "255.255.255.0" ;
char *broadcastAddr = "10.0.255.255" ;
void setBaseNetAddress (char* baseAddr){
strcpy(baseNetAddress,baseAddr);
}
char* getBaseNetAddress (){
return baseNetAddress;
}
void setNetMask (char* baseAddr){
strcpy(netMask,baseAddr);
}
char* getNetMask (){
return netMask;
}
void setBroadcastAddress (char* baseAddr){
strcpy(baseAddr, baseAddr);
}
char* getBroadcastAddress (){
return broadcastAddr;
}
//Add Gateway to the interface
int set_gateway(char *interfaceName, char *gateway)
{
int sock_fd;
struct rtentry rt;
struct sockaddr_in addr;
if((sock_fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
perror("socket failed");
return 1;
}
memset (&rt, 0, sizeof (rt));
addr.sin_family = AF_INET;
/*set Destination addr*/
inet_aton("0.0.0.0",&addr.sin_addr);
memcpy(&rt.rt_dst, &addr, sizeof(struct sockaddr_in));
/*set gateway addr*/
inet_aton(gateway,&addr.sin_addr);
memcpy(&rt.rt_gateway, &addr, sizeof(struct sockaddr_in));
/*set genmask addr*/
inet_aton("0.0.0.0",&addr.sin_addr);
memcpy(&rt.rt_genmask, &addr, sizeof(struct sockaddr_in));
rt.rt_dev = interfaceName;
//rt.rt_flags = RTF_UP|RTF_GATEWAY|RTF_DEFAULT;
rt.rt_flags = RTF_GATEWAY|RTF_DEFAULT;
if (ioctl(sock_fd, SIOCADDRT, &rt) < 0)
{
close(sock_fd);
if(strstr(strerror(errno),"File exists") == NULL)
{
LOG_E(OIP,"ioctl SIOCADDRT failed : %s\n",strerror(errno));
return 2;
}
else /*if SIOCADDRT error is route exist, retrun success*/
{
LOG_I(OIP,"File Exist ...\n");
LOG_I(OIP,"set_gateway OK!\n");
return 0;
}
}
close(sock_fd);
LOG_D(OIP,"Set Gateway OK!\n");
return 0;
}
// sets a genneric interface parameter
// (SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFFLAGS)
int setInterfaceParameter(char *interfaceName, char *settingAddress, int operation)
{
int sock_fd;
struct ifreq ifr;
struct sockaddr_in addr;
if((sock_fd = socket(AF_INET,SOCK_DGRAM,0)) < 0) {
LOG_E(OIP,"Setting operation %d, for %s, address, %s : socket failed\n",
operation, interfaceName, settingAddress);
return 1;
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)-1);
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
inet_aton(settingAddress,&addr.sin_addr);
memcpy(&ifr.ifr_ifru.ifru_addr,&addr,sizeof(struct sockaddr_in));
if(ioctl(sock_fd,operation,&ifr) < 0) {
close(sock_fd);
LOG_E(OIP,"Setting operation %d, for %s, address, %s : ioctl call failed\n",
operation, interfaceName, settingAddress);
return 2;
}
close(sock_fd);
// printf("Set OK!\n");
return 0;
}
// sets a genneric interface parameter
// (SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFFLAGS)
int bringInterfaceUp(char *interfaceName, int up)
{
int sock_fd;
struct ifreq ifr;
if((sock_fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
LOG_E(OIP,"Bringing interface UP, for %s, failed creating socket\n", interfaceName);
return 1;
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)-1);
if(up)
{
ifr.ifr_flags |= IFF_UP | IFF_NOARP | IFF_MULTICAST;
if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t)&ifr) == -1)
{
close(sock_fd);
LOG_E(OIP,"Bringing interface UP, for %s, failed UP ioctl\n", interfaceName);
return 2;
}
}
else
{
// printf("desactivation de %s\n", interfaceName);
ifr.ifr_flags &= (~IFF_UP);
if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t)&ifr) == -1)
{
close(sock_fd);
LOG_E(OIP,"Bringing interface down, for %s, failed UP ioctl\n", interfaceName);
return 2;
}
}
// printf("UP/DOWN OK!\n");
return 0;
}
// non blocking full configuration of the interface (address, net mask, and broadcast mask)
int NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *broadcastAddress)
{
bringInterfaceUp(interfaceName, 0);
// sets the machine address
int returnValue= setInterfaceParameter(interfaceName, ipAddress,SIOCSIFADDR);
// sets the machine network mask
if(!returnValue)
returnValue= setInterfaceParameter(interfaceName, networkMask,SIOCSIFNETMASK);
// sets the machine broadcast address
if(!returnValue)
returnValue= setInterfaceParameter(interfaceName, broadcastAddress,SIOCSIFBRDADDR);
// if(!returnValue)
// returnValue=set_gateway(interfaceName, broadcastAddress);
bringInterfaceUp(interfaceName, 1);
return returnValue;
}
// non blocking full configuration of the interface (address, and the two lest octets of the address)
int nas_config(int interface_id, int thirdOctet, int fourthOctet){
//char buf[5];
char ipAddress[20];
char broadcastAddress[20];
char interfaceName[8];
int returnValue;
sprintf(ipAddress, "10.0.%d.%d", thirdOctet,fourthOctet);
sprintf(broadcastAddress, "10.0.%d.255", thirdOctet);
sprintf(interfaceName, "oai%d", interface_id);
bringInterfaceUp(interfaceName, 0);
// sets the machine address
returnValue= setInterfaceParameter(interfaceName, ipAddress,SIOCSIFADDR);
// sets the machine network mask
if(!returnValue)
returnValue= setInterfaceParameter(interfaceName, netMask,SIOCSIFNETMASK);
// sets the machine broadcast address
if(!returnValue)
returnValue= setInterfaceParameter(interfaceName, broadcastAddress,SIOCSIFBRDADDR);
bringInterfaceUp(interfaceName, 1);
return returnValue;
}
// Blocking full configuration of the interface (address, net mask, and broadcast mask)
int blocking_NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *broadcastAddress)
{
char command[200];
command[0]='\0';
strcat(command, "ifconfig ");
strcat(command, interfaceName);
strcat(command, " ");
strcat(command, ipAddress);
strcat(command, " networkMask ");
strcat(command, networkMask);
strcat(command, " broadcast ");
strcat(command, broadcastAddress);
// ifconfig nasmesh0 10.0.1.1 networkMask 255.255.255.0 broadcast 10.0.1.255
int i = system (command);
return i;
}
// program help
void helpOptions(char **argv)
{
printf("Help for %s\n", argv[0]);
printf(" -i <interfaceName>\n");
printf(" -a <IP address>\n");
printf(" -n <Net mask>\n");
printf(" -b <broadcast address>\n");
printf(" -h Shows this help\n");
printf("If no option is passed as parameter the default values are: \n");
printf(" Interface Name: nasmesh0\n");
printf(" IP Address: 10.0.1.1\n");
printf(" Net mask: 255.255.255.0\n");
printf(" Broadcast address: [Beginning of the IP address].255\n");
exit(1);
}
// creates the broadcast address if it wasn't set before
void createBroadcast(char *broadcastAddress)
{
int pos=strlen(broadcastAddress)-1;
while(broadcastAddress[pos]!='.')
pos--;
broadcastAddress[++pos]='2';
broadcastAddress[++pos]='2';
broadcastAddress[++pos]='5';
broadcastAddress[++pos]='\0';
}
#ifdef STANDALONE
// main function
//---------------------------------------------------------------------------
int main(int argc,char **argv)
//---------------------------------------------------------------------------
{
int c;
char interfaceName[100];
char ipAddress[100];
char networkMask[100];
char broadcastAddress[100];
strcpy(interfaceName, "oai0");
strcpy(ipAddress, "10.0.1.1");
strcpy(networkMask, "255.255.255.0");
broadcastAddress[0]='\0';
while ((c = getopt (argc, argv, "i:a:n:b:h")) != -1)
switch (c)
{
case 'h':
helpOptions(argv);
break;
case 'i':
strcpy(interfaceName,optarg);
break;
case 'a':
strcpy(ipAddress,optarg);
break;
case 'n':
strcpy(networkMask,optarg);
break;
case 'b':
strcpy(broadcastAddress,optarg);
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}
if(strlen(broadcastAddress)==0)
{
strcpy(broadcastAddress,ipAddress);
createBroadcast(broadcastAddress);
}
printf("Command: ifconfig %s %s networkMask %s broadcast %s\n", interfaceName, ipAddress, networkMask, broadcastAddress);
NAS_config(interfaceName, ipAddress, networkMask, broadcastAddress);
//test
// setBaseNetAddress("11.11");
// nas_config(interfaceName, 33, 44);
}
#endif
+158
View File
@@ -0,0 +1,158 @@
/*******************************************************************************
Eurecom OpenAirInterface 2
Copyright(c) 1999 - 2010 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope 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
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fsr/openairinterface
Address : Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France
*******************************************************************************/
/*! \file nas_config.h
* \brief Configures the nasmesh interface
* \author Daniel Camara and navid nikaein
* \date 2006-2011
* \version 0.1
* \company Eurecom
*/
#ifndef NAS_CONFIG_H_
#define NAS_CONFIG_H_
#include <netinet/in.h>
/*! \fn int NAS_config(char*, char*, char*, char*)
* \brief This function initializes the nasmesh interface
* \param[in] interfaceName, the name of the interface, e.g. nasmesh0 or nasmesh1
* \param[in] ipAddress, the address of the interface, e.g. 10.0.1.1
* \param[in] networkMask, the network mask to be used, e.g. 255.255.255.0
* \param[in] broadcastAddress, the broadcast address for the subnet, e.g. 10.0.1.255
* \return 0 on success, otherwise 1, if couldn't open a socket and 2 if the ioctl fails
* \note
* @ingroup ?????
*/
int NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *broadcastAddress);
/*! \fn int nas_config(char*, int, int)
* \brief This function initializes the nasmesh interface using the basic values,
* basic address, network mask and broadcast address, as the default configured
* ones
* \param[in] interfaceName, the name of the interface, e.g. nasmesh0 or nasmesh1
* \param[in] third octet of the ip address e.g. for the 10.1.2.3 address would be 2
* \param[in] fourth octet of the ip address e.g. for the 10.1.2.3 address would be 3
* \return 0 on success, otherwise 1, if couldn't open a socket and 2 if the ioctl fails
* \note
* @ingroup ?????
*/
int nas_config(int interface_id, int thirdOctet, int fourthOctet);
/*! \fn int blocking_NAS_config(char*, char*, char*, char*)
* \brief This function initializes the nasmesh interface, in a blocking way,
* the system calls are interrupted
* \param[in] interfaceName, the name of the interface, e.g. nasmesh0 or nasmesh1
* \param[in] ipAddress, the address of the interface, e.g. 10.0.1.1
* \param[in] networkMask, the network mask to be used, e.g. 255.255.255.0
* \param[in] broadcastAddress, the broadcast address for the subnet, e.g. 10.0.1.255
* \return 0 on success, otherwise 1
* \note
* @ingroup ?????
*/
int blocking_NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *broadcastAddress);
/*! \fn int setInterfaceParameter(char*, char*, int)
* \brief This function sets an genneric interface parameter (SIOCSIFADDR,
* SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFFLAGS)
* \param[in] interfaceName, the name of the interface, e.g. nasmesh0 or nasmesh1
* \param[in] address, the value of the parameter to set, e.g. 10.0.1.255
* \param[in] operation, the operation to perform, (SIOCSIFADDR, SIOCSIFNETMASK,
* SIOCSIFBRDADDR, SIOCSIFFLAGS), e.g. SIOCSIFBRDADDR
* \return 0 on success, otherwise 1, if couldn't open a socket and 2 if the ioctl fails
* \note
* @ingroup ?????
*/
int setInterfaceParameter(char *interfaceName, char *settingAddress, int operation);
/*! \fn int set_gateway(char*, char*)
* \brief This function sets the interface gateway
* \param[in] interfaceName, the name of the interface, e.g. nasmesh0 or nasmesh1
* \param[in] address, the address of the gateway, e.g. 10.0.1.2
* \return 0 on success, otherwise 1, if couldn't open a socket and 2 if the ioctl fails
* \note
* @ingroup ?????
*/
int set_gateway(char *interfaceName, char *gateway);
/*! \fn void setBaseNetAddress(char*)
* \brief This function sets the basic network address used
* \param[in] baseAddr, the new basic address e.g.for 10.0.1.2, would be 10.0
* \note
* @ingroup ?????
*/
void setBaseNetAddress (char* baseAddr);
/*! \fn char* getBaseNetAddress()
* \brief This function returns the basic network address used
* \return the basic network address in use
* \note
* @ingroup ?????
*/
char* getBaseNetAddress ();
/*! \fn void setNetMask(char*)
* \brief This function sets the new default network mask used
* \param[in] newNetworkMask, the new network mask e.g.for 255.255.0.0
* \note
* @ingroup ?????
*/
void setNetMask (char* baseAddr);
/*! \fn char* getNetMask()
* \brief This function returns the network mask address in use
* \return the network mask in use
* \note
* @ingroup ?????
*/
char* getNetMask ();
/*! \fn coid setBroadcastAddress(char*)
* \brief This function sets the new broadcast address used
* \param[in] newNetworkMask, the new broadcast address e.g.for 10.0.255.255
* \note
* @ingroup ?????
*/
void setBroadcastAddress (char* baseAddr);
/*! \fn char* getBroadcastAddress()
* \brief This function returns the broadcast address in use
* \return the broadcast address in use
* \note
* @ingroup ?????
*/
char* getBroadcastAddress ();
int rb_validate_config_ipv4(int cx, int inst, int rb);
int rb_conf_ipv4(int action,int cx, int inst, int rb,int dscp, in_addr_t saddr_ipv4, in_addr_t daddr_ipv4);
void rb_ioctl_init(int inst);
int rb_stats_req(int inst);
void init_socket(void);
in_addr_t ipv4_address (int thirdOctet, int fourthOctet);
#endif /*NAS_CONFIG_H_*/
+251
View File
@@ -0,0 +1,251 @@
/*! \file rb_config.c
* \brief User-space utility for configuring NASMESH IOCTL interface
* \copyright 2009 EURECOM
* \author Raymond Knopp and Navid Nikaein
* \date 2009
* \version 1.1
* \warning
* @ingroup driver
*/
#include "nas_config.h"
#include "UTIL/LOG/log.h"
#include "NAS/DRIVER/MESH/rrc_nas_primitives.h"
#include "NAS/DRIVER/MESH/ioctl.h"
#include "NAS/DRIVER/MESH/constant.h"
#define BUF_SIZE 800
// Global variables
//int sd_graal;
//int fd; // moved to the struct rb_config
//char myIPAddr[16]; // local IP Address
//int meas_counter;
//struct ralu_priv ru_priv;
//struct ralu_priv *ralupriv;
//ioctl
char dummy_buffer[BUF_SIZE]; // moved to stats req
struct nas_ioctl gifr;
//int wait_start_nas;
static int fd;
static int socket_enabled;
void init_socket(void){
if ((fd=socket(AF_INET6, SOCK_DGRAM, 0)) < 0){
LOG_E(OIP,"ERROR opening socket\n");
socket_enabled=0;
}
socket_enabled=1;
}
void rb_ioctl_init(int inst) {
/* init the gifr struct for the given inst */
sprintf(gifr.name, "oai%d",inst);
memset ((void *)dummy_buffer,0,BUF_SIZE);
gifr.msg= &(dummy_buffer[0]);
}
int rb_validate_config_ipv4(int cx, int inst, int rb) {
struct sockaddr_in sa;
if (inst == -1){
LOG_E(OIP,"Specify an interface\n");
return(1);
}
if (rb == -1) {
LOG_E(OIP,"Specify an RAB identifier \n");
return (1);
}
if (cx == -1) {
LOG_E(OIP,"Specify an LCR \n");
return(1);
}
/*
if ( inet_aton(src,&saddr_ipv4)<= 0) {
LOG_E(OIP,"Specify a source IP address\n");
return(1);
}
if (inet_aton(src,&saddr_ipv4)<= 0 0) {
LOG_E(OIP,"Specify a destination IP address\n");
return(1);
}
*/
return (0);
}
int rb_conf_ipv4(int action,int cx, int inst, int rb, int dscp, in_addr_t saddr_ipv4, in_addr_t daddr_ipv4) {
//int rb_conf_ipv6(int action,int cx, int inst, int qos, in6_addr src, in6_addr dst) {
//int rb_conf(rb_config *rb_cfg) {
int err;
unsigned int mpls_outlabel,mpls_inlabel;
char addr_str[46];
struct nas_msg_rb_establishment_request *msgreq;
struct nas_msg_class_add_request *msgreq_class;
struct nas_msg_rb_release_request *msgrel;
struct nas_msg_class_del_request *msgdel_class;
if (socket_enabled ==0){
init_socket();
}
rb_ioctl_init(inst);
if (rb_validate_config_ipv4(cx,inst,rb) > 0){
LOG_E(OIP, "OIP configuration failed, inputs parameters incorrect\n");
return (1);
}
// add an OIP
if (action == 0 ) {
msgreq = (struct nas_msg_rb_establishment_request *)(gifr.msg);
msgreq->rab_id = (nasRadioBearerId_t) rb;
msgreq->lcr = (nasRadioBearerId_t) cx;
msgreq->qos = 0;
gifr.type = NAS_MSG_RB_ESTABLISHMENT_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0){
perror("IOCTL error: OIP ESTAB REQ\n");
LOG_E(OIP,"IOCTL error: OIP ESTAB REQ");
}
msgreq_class = (struct nas_msg_class_add_request *)(gifr.msg);
msgreq_class->rab_id = (nasRadioBearerId_t) rb;
msgreq_class->lcr = (nasRadioBearerId_t) cx;
msgreq_class->version = 4;//ipv4
msgreq_class->classref = 0 + (msgreq_class->lcr<<3);
msgreq_class->dir = NAS_DIRECTION_SEND;
msgreq_class->fct = NAS_FCT_QOS_SEND;
msgreq_class->saddr.ipv4 = saddr_ipv4;
msgreq_class->daddr.ipv4 = daddr_ipv4;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = NAS_PROTOCOL_DEFAULT;
msgreq_class->dscp=dscp;
gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0 ){
perror("IOCTL error: DIR SEND: ADD REQ");
LOG_E(OIP,"IOCTL error: DIR SEND: ADD REQ\n");
}
msgreq_class->rab_id = (nasRadioBearerId_t)rb;
msgreq_class->lcr = (nasRadioBearerId_t)cx;
msgreq_class->classref = 1+(msgreq_class->lcr<<3);
msgreq_class->dir = NAS_DIRECTION_RECEIVE;
msgreq_class->daddr.ipv4 = saddr_ipv4;
msgreq_class->saddr.ipv4 = daddr_ipv4;
gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0 ){
perror("IOCTL error: DIR RECEIVE: ADD REQ");
LOG_E(OIP,"IOCTL error: DIR RECEIVE: ADD REQ\n");
}
}
// OIP DEL
else if (action == 1) {
msgrel = (struct nas_msg_rb_release_request *)(gifr.msg);
msgrel->rab_id = rb;
msgrel->lcr = cx;
gifr.type = NAS_MSG_RB_RELEASE_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0){
perror("IOCTL error: OIP RELEASE REQ");
LOG_E(OIP,"IOCTL error: OIP RELEASE REQ\n");
}
msgdel_class = (struct nas_msg_class_del_request *)(gifr.msg);
msgdel_class->lcr = cx;
msgdel_class->dir = NAS_DIRECTION_SEND;
msgdel_class->classref = 0 + (msgdel_class->lcr<<3);
msgdel_class->dscp=dscp;
gifr.type = NAS_MSG_CLASS_DEL_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0 ){
perror("IOCTL error: DIR SEND : CLASS DEL REQ");
LOG_E(OIP,"IOCTL error: DIR SEND : CLASS DEL REQ\n");
}
msgdel_class->lcr = cx;
msgdel_class->classref = 1+(msgdel_class->lcr<<3);
msgdel_class->dir = NAS_DIRECTION_RECEIVE;
gifr.type = NAS_MSG_CLASS_DEL_REQUEST;
if ((err=ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0 ){
perror("IOCTL error: DIR RECEIVE : CLASS DEL REQ");
LOG_E(OIP,"IOCTL erro: DIR RECEIVE : CLASS DEL REQ\n");
}
}
return(0);
}
int rb_stats_req(int inst) {
if ( fd <= 0 ){
return (1);
} /* request stats without defining the interface */
else if (inst == -1){
// printf("Specify an interface for statistics request \n");
LOG_E(OIP,"Specify an interface for statistics request \n");
return (1);
}
struct nas_msg_statistic_reply *msgrep;
int err;
rb_ioctl_init(inst);
gifr.type = NAS_MSG_STATISTIC_REQUEST;
msgrep=(struct nas_msg_statistic_reply *)(gifr.msg);
if ((err = ioctl(fd, NAS_IOCTL_RRM, &gifr)) < 0 ) {
perror("IOCTL error: STATS REQ FAILED\n");
LOG_E(OIP,"IOCTL error: STATS REQ FAILED\n");
}
LOG_I(OIP,"ioctl :Statistics request");
LOG_I(OIP,"tx_packets = %u, rx_packets = %u\n", msgrep->tx_packets, msgrep->rx_packets);
LOG_I(OIP,"tx_bytes = %u, rx_bytes = %u\n", msgrep->tx_bytes, msgrep->rx_bytes);
LOG_I(OIP,"tx_errors = %u, rx_errors = %u\n", msgrep->tx_errors, msgrep->rx_errors);
LOG_I(OIP,"tx_dropped = %u, rx_dropped = %u\n", msgrep->tx_dropped, msgrep->rx_dropped);
return (0);
}
in_addr_t ipv4_address (int thirdOctet, int fourthOctet){
in_addr_t saddr_ipv4;
char ipAddress[20];
sprintf(ipAddress, "10.0.%d.%d",thirdOctet,fourthOctet);
inet_aton(ipAddress,&saddr_ipv4);
return saddr_ipv4;
}
+49
View File
@@ -0,0 +1,49 @@
/** \file rb_config.h
* \brief Openair radio bearer configuration header file
*
*/
#ifndef __RB_CONFIG_H__
#define __RB_CONFIG_H__
#include <netinet/in.h>
/*
typedef struct {
int fd; // socket file descriptor
int stats;
int action; // add or delete
int rb;
int cx;
int inst;
int saddr_ipv4set;
int daddr_ipv4set;
in_addr_t saddr_ipv4;
in_addr_t daddr_ipv4;
int saddr_ipv6set;
int daddr_ipv6set;
struct in6_addr saddr_ipv6;
struct in6_addr daddr_ipv6;
int dscp;
} rb_config;
*/
int rb_validate_config_ipv4(int cx, int inst, int rb);
int rb_conf_ipv4(int action,int cx, int inst, int rb, int dscp, in_addr_t saddr_ipv4, in_addr_t daddr_ipv4);
void rb_ioctl_init(int inst);
int rb_stats_req(int inst);
void init_socket(void);
in_addr_t ipv4_address (int thirdOctet, int fourthOctet);
#endif