Commit a632b032 authored by gauthier's avatar gauthier

Add 802.21 in oaisim exe, work in progress.


git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4658 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 568128e1
......@@ -6,7 +6,14 @@ ITTI_OBJS += $(ITTI_DIR)/backtrace.o
ITTI_OBJS += $(ITTI_DIR)/signals.o
ITTI_OBJS += $(ITTI_DIR)/timer.o
UTILS_OBJS = $(ITTI_OBJS)
HASHTABLE_DIR = $(COMMON_UTILS_DIR)/collection/hashtable
HASHTABLE_OBJS = $(HASHTABLE_DIR)/hashtable.o
HASHTABLE_OBJS += $(HASHTABLE_DIR)/obj_hashtable.o
UTILS_OBJS = $(ITTI_OBJS) $(HASHTABLE_OBJS)
UTILS_incl = \
-I$(COMMON_UTILS_DIR) \
......
......@@ -9,3 +9,5 @@
#include "s1ap_messages_def.h"
#include "sctp_messages_def.h"
#include "x2ap_messages_def.h"
#include "ral_messages_def.h"
......@@ -16,5 +16,6 @@
#include "s1ap_messages_types.h"
#include "sctp_messages_types.h"
#include "x2ap_messages_types.h"
#include "ral_messages_types.h"
#endif /* MESSAGES_TYPES_H_ */
MESSAGE_DEF(RRC_RAL_SYSTEM_CONFIGURATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_configuration_ind_t, rrc_ral_system_configuration_ind)
MESSAGE_DEF(RRC_RAL_SYSTEM_INFORMATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_information_ind_t, rrc_ral_system_information_ind)
MESSAGE_DEF(RRC_RAL_SCAN_REQ, MESSAGE_PRIORITY_MED, rrc_ral_scan_req_t, rrc_ral_scan_req)
MESSAGE_DEF(RRC_RAL_SCAN_CONF, MESSAGE_PRIORITY_MED, rrc_ral_scan_conf_t, rrc_ral_scan_conf)
MESSAGE_DEF(RRC_RAL_CONFIGURE_THRESHOLD_REQ, MESSAGE_PRIORITY_MAX, rrc_ral_configure_threshold_req_t, rrc_ral_configure_threshold_req)
MESSAGE_DEF(RRC_RAL_CONFIGURE_THRESHOLD_CONF, MESSAGE_PRIORITY_MED, rrc_ral_configure_threshold_conf_t, rrc_ral_configure_threshold_conf)
MESSAGE_DEF(RRC_RAL_MEASUREMENT_REPORT_IND, MESSAGE_PRIORITY_MAX, rrc_ral_measurement_report_ind_t, rrc_ral_measurement_report_ind)
MESSAGE_DEF(RRC_RAL_CONNECTION_ESTABLISHMENT_REQ, MESSAGE_PRIORITY_MED, rrc_ral_connection_establishment_req_t, rrc_ral_connection_establishment_req)
MESSAGE_DEF(RRC_RAL_CONNECTION_ESTABLISHMENT_CONF, MESSAGE_PRIORITY_MED, rrc_ral_connection_establishment_conf_t, rrc_ral_connection_establishment_conf)
MESSAGE_DEF(RRC_RAL_CONNECTION_ESTABLISHMENT_IND, MESSAGE_PRIORITY_MED, rrc_ral_connection_establishment_ind_t, rrc_ral_connection_establishment_ind)
MESSAGE_DEF(RRC_RAL_CONNECTION_REESTABLISHMENT_IND, MESSAGE_PRIORITY_MED, rrc_ral_connection_reestablishment_ind_t, rrc_ral_connection_reestablishment_ind)
MESSAGE_DEF(RRC_RAL_CONNECTION_RECONFIGURATION_IND, MESSAGE_PRIORITY_MAX, rrc_ral_connection_reconfiguration_ind_t, rrc_ral_connection_reconfiguration_ind)
MESSAGE_DEF(RRC_RAL_CONNECTION_RELEASE_REQ, MESSAGE_PRIORITY_MED, rrc_ral_connection_release_req_t, rrc_ral_connection_release_req)
MESSAGE_DEF(RRC_RAL_CONNECTION_RELEASE_CONF, MESSAGE_PRIORITY_MED, rrc_ral_connection_release_conf_t, rrc_ral_connection_release_conf)
MESSAGE_DEF(RRC_RAL_CONNECTION_RELEASE_IND, MESSAGE_PRIORITY_MED, rrc_ral_connection_release_ind_t, rrc_ral_connection_release_ind)
#ifndef RAL_MESSAGES_TYPES_H_
#define RAL_MESSAGES_TYPES_H_
#include "asn1_constants.h"
#include "platform_types.h"
/* 802.21 mappings with the RRC protocol :
(Research Report RR-12-265 Mapping of IEEE 802.21 MIH primitives to EPS/LTE protocols March 13 th, 2012, Michelle WETTERWALD, Prof. Christian BONNET )
LINK EVENTS:
Link_Detected System Information
Link_Up RRC Connection establishment
RRC Connection re-establishment
RRC Connection reconfiguration
Link_Down RRC Connection reconfiguration
RRC Connection Release
Link_Parameters_Report Measurement report
Link_Going_Down N/A
Link_Handover_Imminent N/A
Link_Handover_Complete RRC Connection reconfiguration
Link_PDU_Transmit_Status N/A
LINK COMMANDS:
Link_Capability_Discover N/A
Link_Event_Subscribe Measurement configuration
Link_Event_Unsubscribe Measurement configuration
Link_Get_Parameters Measurement configuration
Link_Configure_Thresholds Measurement configuration
Link_Action / Disconnect RRC Connection Release
Link_Action / Low Power N/A
Link_Action / Power Down RRC Connection Release
Link_Action / Power Up RRC Connection establishment
*/
#define RRC_RAL_SYSTEM_CONFIGURATION_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_system_configuration_ind
#define RRC_RAL_SYSTEM_INFORMATION_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_system_information_ind
#define RRC_RAL_CONFIGURE_THRESHOLD_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_configure_threshold_req
#define RRC_RAL_CONFIGURE_THRESHOLD_CONF(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_configure_threshold_conf
#define RRC_RAL_MEASUREMENT_REPORT_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_measurement_report_ind
#define RRC_RAL_CONNECTION_ESTABLISHMENT_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_establishment_req
#define RRC_RAL_CONNECTION_ESTABLISHMENT_CONF(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_establishment_conf
#define RRC_RAL_CONNECTION_ESTABLISHMENT_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_establishment_ind
#define RRC_RAL_CONNECTION_REESTABLISHMENT_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_reestablishment_ind
#define RRC_RAL_CONNECTION_RECONFIGURATION_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_reconfiguration_ind
#define RRC_RAL_CONNECTION_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_release_req
#define RRC_RAL_CONNECTION_RELEASE_CONF(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_release_conf
#define RRC_RAL_CONNECTION_RELEASE_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_ral_connection_release_ind
#include "MIH_C_header_codec.h"
typedef MIH_C_TRANSACTION_ID_T ral_transaction_id_t;
typedef MIH_C_STATUS_T ral_status_t;
typedef MIH_C_CHOICE_T ral_choice_t;
typedef MIH_C_CONFIG_STATUS_T ral_config_status_t;
typedef MIH_C_TH_ACTION_T ral_th_action_t;
#define RAL_STATUS_SUCCESS MIH_C_STATUS_SUCCESS
#define RAL_STATUS_UNSPECIFIED_FAILURE MIH_C_STATUS_UNSPECIFIED_FAILURE
#define RAL_STATUS_REJECTED MIH_C_STATUS_REJECTED
#define RAL_STATUS_AUTHORIZATION_FAILURE MIH_C_STATUS_AUTHORIZATION_FAILURE
#define RAL_STATUS_NETWORK_ERROR MIH_C_STATUS_NETWORK_ERROR
#define RAL_3GPP_ADDR_LENGTH MIH_C_3GPP_ADDR_LENGTH
#define RAL_3GPP2_ADDR_LENGTH MIH_C_3GPP2_ADDR_LENGTH
#define RAL_OTHER_L2_ADDR_LENGTH MIH_C_OTHER_L2_ADDR_LENGTH
#define RAL_LINK_SCAN_RSP_LENGTH MIH_C_LINK_SCAN_RSP_LENGTH
#define RAL_THRESHOLD_LIST_LENGTH MIH_C_THRESHOLD_LIST_LENGTH
#define RAL_LINK_ADDR_LIST_LENGTH MIH_C_LINK_ADDR_LIST_LENGTH
#define RAL_QOS_LIST_LENGTH MIH_C_QOS_LIST_LENGTH
#define RAL_LINK_STATUS_REQ_LIST_LENGTH MIH_C_LINK_STATUS_REQ_LIST_LENGTH
#define RAL_LINK_CFG_PARAM_LIST_LENGTH MIH_C_LINK_CFG_PARAM_LIST_LENGTH
typedef struct ral_network_id_s { u_int16_t length; u_int8_t val[253];} ral_network_id_t;
typedef struct ral_link_addr_s { u_int16_t length; u_int8_t val[RAL_LINK_ADDR_LIST_LENGTH];} ral_link_addr_t;
typedef struct ral_sig_strength_s {
ral_choice_t choice;
union {
uint8_t dbm;
uint8_t percentage;
} _union;
} ral_sig_strength_t;
#define RAL_SIG_STRENGTH_CHOICE_DBM (ral_choice_t)0
#define RAL_SIG_STRENGTH_CHOICE_PERCENTAGE (ral_choice_t)1
// FOR ENB ONLY
typedef struct rrc_ral_system_configuration_ind_s {
plmn_t plmn_id;
unsigned int cell_id:28;
}rrc_ral_system_configuration_ind_t;
// FOR UE ONLY
typedef struct rrc_ral_system_information_ind_s {
plmn_t plmn_id;
unsigned int cell_id:28;
uint8_t dbm; // sig strength
uint16_t sinr;
uint32_t link_data_rate; //the maximum data rate in kb/s
}rrc_ral_system_information_ind_t;
typedef struct ral_link_scan_resp_s {
ral_link_addr_t link_addr;
ral_network_id_t network_id;
ral_sig_strength_t sig_strength;
} ral_link_scan_resp_t;
typedef struct rrc_ral_scan_req_s {
ral_transaction_id_t transaction_id;
}rrc_ral_scan_req_t;
typedef struct rrc_ral_scan_conf_s {
ral_transaction_id_t transaction_id;
#define RAL_MAX_LINK_SCAN_RESP 16
uint8_t num_scan_resp;
ral_link_scan_resp_t ink_scan_resp[RAL_MAX_LINK_SCAN_RESP];
}rrc_ral_scan_conf_t;
typedef struct rrc_ral_connection_establishment_req_s{
ral_transaction_id_t transaction_id;
}rrc_ral_connection_establishment_req_t;
typedef struct rrc_ral_connection_establishment_conf_s{
ral_transaction_id_t transaction_id;
}rrc_ral_connection_establishment_conf_t;
typedef struct rrc_ral_connection_establishment_ind_s {
uint16_t ue_id; // may be c-rnti
}rrc_ral_connection_establishment_ind_t;
typedef struct rrc_ral_connection_reestablishment_ind_s {
uint16_t ue_id;
uint8_t num_drb;
rb_id_t drb_id[maxDRB];
uint8_t num_srb;
}rrc_ral_connection_reestablishment_ind_t;
typedef struct rrc_ral_connection_reconfiguration_ind_s {
uint16_t ue_id;
}rrc_ral_connection_reconfiguration_ind_t;
#define RAL_ABOVE_THRESHOLD MIH_C_ABOVE_THRESHOLD
#define RAL_BELOW_THRESHOLD MIH_C_BELOW_THRESHOLD
typedef struct ral_threshold_s {
uint16_t threshold_val;
uint8_t threshold_xdir;
}ral_threshold_t;
typedef MIH_C_LINK_PARAM_GEN_T ral_link_param_gen_t;
#define RAL_LINK_PARAM_GEN_DATA_RATE MIH_C_LINK_PARAM_GEN_DATA_RATE
#define RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH MIH_C_LINK_PARAM_GEN_SIGNAL_STRENGTH
#define RAL_LINK_PARAM_GEN_SINR MIH_C_LINK_PARAM_GEN_SINR
#define RAL_LINK_PARAM_GEN_THROUGHPUT MIH_C_LINK_PARAM_GEN_THROUGHPUT
#define RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE MIH_C_LINK_PARAM_GEN_PACKET_ERROR_RATE
typedef MIH_C_LINK_PARAM_QOS_T ral_link_param_qos_t;
typedef MIH_C_LINK_PARAM_LTE_T ral_link_param_lte_t;
#define RAL_LINK_PARAM_LTE_UE_RSRP MIH_C_LINK_PARAM_LTE_UE_RSRP
#define RAL_LINK_PARAM_LTE_UE_RSRQ MIH_C_LINK_PARAM_LTE_UE_RSRQ
#define RAL_LINK_PARAM_LTE_UE_CQI MIH_C_LINK_PARAM_LTE_UE_CQI
#define RAL_LINK_PARAM_LTE_AVAILABLE_BW MIH_C_LINK_PARAM_LTE_AVAILABLE_BW
#define RAL_LINK_PARAM_LTE_PACKET_DELAY MIH_C_LINK_PARAM_LTE_PACKET_DELAY
#define RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE MIH_C_LINK_PARAM_LTE_PACKET_LOSS_RATE
#define RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS MIH_C_LINK_PARAM_LTE_L2_BUFFER_STATUS
#define RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES MIH_C_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES
#define RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY MIH_C_LINK_PARAM_LTE_EMBMS_CAPABILITY
#define RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY MIH_C_LINK_PARAM_LTE_JUMBO_FEASIBILITY
#define RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS MIH_C_LINK_PARAM_LTE_JUMBO_SETUP_STATUS
#define RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW MIH_C_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW
#define RAL_LINK_PARAM_TYPE_CHOICE_GEN MIH_C_LINK_PARAM_TYPE_CHOICE_GEN
#define RAL_LINK_PARAM_TYPE_CHOICE_QOS MIH_C_LINK_PARAM_TYPE_CHOICE_QOS
#define RAL_LINK_PARAM_TYPE_CHOICE_LTE MIH_C_LINK_PARAM_TYPE_CHOICE_LTE
typedef struct ral_link_param_type_s {
ral_choice_t choice;
union {
ral_link_param_gen_t link_param_gen;
ral_link_param_qos_t link_param_qos;
ral_link_param_lte_t link_param_lte;
} _union;
} ral_link_param_type_t;
typedef struct ral_link_cfg_param_s {
ral_link_param_type_t link_param_type;
#define RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL 0
#define RAL_LINK_CFG_PARAM_CHOICE_TIMER 1
uint8_t union_choice;
union {
uint8_t null_attr;
uint16_t timer_interval; // This timer value (ms) is used to set the interval between periodic reports.
} _union;
#define RAL_TH_ACTION_SET_NORMAL_THRESHOLD MIH_C_SET_NORMAL_THRESHOLD
#define RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD MIH_C_SET_ONE_SHOT_THRESHOLD
#define RAL_TH_ACTION_CANCEL_THRESHOLD MIH_C_CANCEL_THRESHOLD
ral_th_action_t th_action; // indicates what action to apply to the listed thresholds.
// When “Cancel threshold” is selected and no thresholds are specified, then
// all currently configured thresholds for the given LINK_PARAM_TYPE are can-
// celled.
// When “Cancel threshold” is selected and thresholds are specified only those
// configured thresholds for the given LINK_PARAM_TYPE and whose threshold
// value match what was specified are cancelled.
// With “Set one-shot threshold” the listed thresholds are first set and then
// each of the threshold is cancelled as soon as it is crossed for the first
// time.
uint8_t num_thresholds;
#define RAL_LINK_CFG_PARAM_MAX_THRESHOLDS 16
ral_threshold_t thresholds[RAL_LINK_CFG_PARAM_MAX_THRESHOLDS];
} ral_link_cfg_param_t;
typedef struct rrc_ral_configure_threshold_req_s {
ral_transaction_id_t transaction_id;
#define RAL_MAX_LINK_CFG_PARAMS 16
uint8_t num_link_cfg_params;
ral_link_cfg_param_t link_cfg_params[RAL_MAX_LINK_CFG_PARAMS];
}rrc_ral_configure_threshold_req_t;
typedef struct ral_link_cfg_status_s {
ral_link_param_type_t link_param_type;
ral_threshold_t threshold;
ral_config_status_t config_status;
} ral_link_cfg_status_t;
typedef struct rrc_ral_configure_threshold_conf_s {
ral_transaction_id_t transaction_id;
ral_status_t status;
uint8_t num_link_cfg_params;
ral_link_cfg_status_t cfg_status[RAL_MAX_LINK_CFG_PARAMS];
}rrc_ral_configure_threshold_conf_t;
typedef struct rrc_ral_measurement_report_ind_s{
}rrc_ral_measurement_report_ind_t;
typedef struct rrc_ral_connection_release_req_s{
ral_transaction_id_t transaction_id;
uint16_t ue_id;
}rrc_ral_connection_release_req_t;
typedef struct rrc_ral_connection_release_conf_s{
ral_transaction_id_t transaction_id;
uint16_t ue_id;
}rrc_ral_connection_release_conf_t;
typedef struct rrc_ral_connection_release_ind_s{
uint16_t ue_id;
}rrc_ral_connection_release_ind_t;
#endif /* RAL_MESSAGES_TYPES_H_ */
......@@ -20,6 +20,9 @@ SUB_TASK_DEF(TASK_L2L1, TASK_PDCP_ENB, 200)
/// Radio Resource Control task
TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200)
/// S1ap task
/// RAL task for ENB
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200)
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200)
/// X2ap task, acts as both source and target
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200)
......@@ -39,4 +42,5 @@ SUB_TASK_DEF(TASK_L2L1, TASK_PDCP_UE, 200)
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200)
/// Non Access Stratum task
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200)
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200)
......@@ -361,15 +361,21 @@ protected_pdcp_fifo(void pdcp_fifo_read_input_sdus_from_otg (u32_t frame, u8_t e
/*
* Following two types are utilized between NAS driver and PDCP
*/
typedef struct pdcp_data_req_header_t {
typedef int traffic_type_t;
typedef struct pdcp_data_req_header_s {
rb_id_t rb_id;
sdu_size_t data_size;
int inst;
sdu_size_t data_size;
int inst;
traffic_type_t traffic_type;
} pdcp_data_req_header_t;
typedef struct pdcp_data_ind_header_t {
typedef struct pdcp_data_ind_header_s {
rb_id_t rb_id;
sdu_size_t data_size;
int inst;
sdu_size_t data_size;
int inst;
int dummy;
} pdcp_data_ind_header_t;
struct pdcp_netlink_element_s {
......
......@@ -60,6 +60,7 @@ extern int otg_enabled;
#include "../MAC/extern.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
#include "NAS/DRIVER/LITE/constant.h"
#include "SIMULATION/ETH_TRANSPORT/extern.h"
#include "UTIL/OCG/OCG.h"
#include "UTIL/OCG/OCG_extern.h"
......@@ -312,6 +313,22 @@ int
pdcp_input_sdu_buffer,
PDCP_DATA_PDU);
}
} else if ((pdcp_input_header.traffic_type == OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST) || (pdcp_input_header.traffic_type == OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST)) {
printf("[MSC_MSG][FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ on MBMS bearer/ %d Bytes --->][PDCP][MOD %02d][RB %02d]\n",
frame, pdcp_read_header.inst, pdcp_read_header.data_size, pdcp_read_header.inst, pdcp_read_header.rb_id);
if (pdcp_array[pdcp_read_header.inst][pdcp_read_header.rb_id%NB_RB_MAX].instanciated_instance) {
pdcp_data_req (pdcp_input_header.inst,
frame, eNB_flag,
pdcp_input_header.rb_id,
RLC_MUI_UNDEFINED,
RLC_SDU_CONFIRM_NO,
pdcp_input_header.data_size,
pdcp_input_sdu_buffer,
PDCP_TM);
}
} else if (eNB_flag) {
// is a broadcast packet, we have to send this packet on all default RABS of all connected UEs
LOG_D(PDCP, "Checking if could sent on default rabs\n");
......@@ -537,12 +554,10 @@ int pdcp_fifo_read_input_sdus (u32_t frame, u8_t eNB_flag, u8_t UE_index, u8_t e
while (pdcp_netlink_dequeue_element(eNB_flag, UE_index, eNB_index, &data) != 0) {
if (data->pdcp_read_header.rb_id != 0) {
if (pdcp_array[data->pdcp_read_header.inst][data->pdcp_read_header.rb_id%NB_RB_MAX].instanciated_instance) {
#ifdef PDCP_DEBUG
LOG_D(PDCP, "[MSC_MSG][FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ "
LOG_D(PDCP, "[FRAME %05d][IP][MOD %02d][][--- PDCP_DATA_REQ "
"/ %d Bytes --->][PDCP][MOD %02d][RB %02d]\n",
frame, data->pdcp_read_header.inst, data->pdcp_read_header.data_size,
data->pdcp_read_header.inst, data->pdcp_read_header.rb_id);
#endif
pdcp_data_req(data->pdcp_read_header.inst,
frame,
......
......@@ -134,6 +134,12 @@ nasmesh_netlink.ko:
naslite_netlink_ether.ko:
(cd NAS/DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C /usr/src/$(LINUX_KERNEL) M=`pwd` modules)
oai_nw_ether.ko:
(cd NAS/DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C /usr/src/$(LINUX_KERNEL) M=`pwd` modules)
oai_nw_drv.ko:
(cd NAS/DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C /usr/src/$(LINUX_KERNEL) M=`pwd` modules)
nasmesh_netlink_address_fix.ko:
(cd NAS/DRIVER/MESH && $(MAKE) -j$(NUM_CORES) $(SET_UM) NAS_NETLINK=1 ADDRESS_FIX=1 V=1 -C /usr/src/$(LINUX_KERNEL) M=`pwd` modules)
......
......@@ -92,7 +92,7 @@ obj-m += oai_nw_drv.o
oai_nw_drv-objs += device.o
oai_nw_drv-objs += common.o
oai_nw_drv-objs += ioctl.o
#oai_nw_drv-objs += classifier.o
oai_nw_drv-objs += classifier.o
oai_nw_drv-objs += tool.o
ifdef OAI_NW_DRIVER_USE_NETLINK
oai_nw_drv-objs += netlink.o
......
......@@ -148,168 +148,59 @@
&& ((((__const uint8_t *) (a))[3] & (((__const uint8_t *) (m))[3])) == (((__const uint8_t *) (b))[3] & (((__const uint8_t *) (m))[3]))))
//#define OAI_DRV_DEBUG_CLASS
//#define OAI_DRV_DEBUG_SEND
//---------------------------------------------------------------------------
void oai_nw_drv_create_mask_ipv6_addr(struct in6_addr *masked_addrP, int prefix_len){
// Find the IP traffic type (UNICAST, MULTICAST, BROADCAST)
traffic_type_t oai_nw_drv_find_traffic_type(struct sk_buff *skb) {
//---------------------------------------------------------------------------
int u6_addr8_index;
int u6_addr1_index;
int index;
masked_addrP->s6_addr32[0] = 0xFFFFFFFF;
masked_addrP->s6_addr32[1] = 0xFFFFFFFF;
masked_addrP->s6_addr32[2] = 0xFFFFFFFF;
masked_addrP->s6_addr32[3] = 0xFFFFFFFF;
switch (prefix_len) {
case 128:
return;
case 112:
masked_addrP->s6_addr32[3] = htonl(0xFFFF0000);
return;
case 96:
masked_addrP->s6_addr32[3] = 0x00000000;
return;
case 80:
masked_addrP->s6_addr32[2] = htonl(0xFFFF0000);
masked_addrP->s6_addr32[3] = 0x00000000;
return;
case 64:
masked_addrP->s6_addr32[2] = 0x00000000;
masked_addrP->s6_addr32[3] = 0x00000000;
return;
case 48:
masked_addrP->s6_addr32[1] = htonl(0xFFFF0000);
masked_addrP->s6_addr32[2] = 0x00000000;
masked_addrP->s6_addr32[3] = 0x00000000;
return;
case 32:
masked_addrP->s6_addr32[1] = 0x00000000;
masked_addrP->s6_addr32[2] = 0x00000000;
masked_addrP->s6_addr32[3] = 0x00000000;
return;
case 16:
masked_addrP->s6_addr32[0] = htonl(0xFFFF0000);
masked_addrP->s6_addr32[1] = 0x00000000;
masked_addrP->s6_addr32[2] = 0x00000000;
masked_addrP->s6_addr32[3] = 0x00000000;
return;
default:
u6_addr8_index = prefix_len >> 3;
u6_addr1_index = prefix_len & 0x07;
for (index = u6_addr8_index ; index < 16; index++) {
masked_addrP->s6_addr[index] = 0;
}
if (u6_addr1_index > 0) {
masked_addrP->s6_addr[u6_addr8_index+1] = htons(0xFF << (8-u6_addr1_index));
}
for (index = 0 ; index < 4; index++) {
masked_addrP->s6_addr32[index] = htonl(masked_addrP->s6_addr32[index]);
}
}
}
//---------------------------------------------------------------------------
void oai_nw_drv_create_mask_ipv4_addr(struct in_addr *masked_addrP, int prefix_len){
//---------------------------------------------------------------------------
if (prefix_len > 32) {
prefix_len = 32;
}
masked_addrP->s_addr = htonl(0xFFFFFFFF << (32 - prefix_len));
return;
}
//---------------------------------------------------------------------------
// Search the entity with the IPv6 address 'addr'
// Navid: the ipv6 classifier is not fully tested
struct cx_entity *oai_nw_drv_find_cx6(struct sk_buff *skb,
unsigned char dscp,
struct oai_nw_drv_priv *gpriv,
int inst,
int *paddr_type,
unsigned char *cx_searcher) {
//---------------------------------------------------------------------------
unsigned char cxi;
struct cx_entity *cx = NULL;
struct classifier_entity *sclassifier= NULL;
u32 mc_addr_hdr;
struct in6_addr masked_addr;
traffic_type_t traffic_type = OAI_NW_DRV_IPVX_ADDR_TYPE_UNKNOWN;
if (skb!=NULL) {
switch (ntohs(skb->protocol)) {
case ETH_P_IPV6:
traffic_type = OAI_NW_DRV_IPV6_ADDR_TYPE_UNKNOWN;
#ifdef OAI_DRV_DEBUG_CLASS
printk("SOURCE ADDR %X:%X:%X:%X:%X:%X:%X:%X",NIP6ADDR(&(ipv6_hdr(skb)->saddr)));
printk(" DEST ADDR %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&(ipv6_hdr(skb)->daddr)));
#endif
mc_addr_hdr = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[0]);
//printk(" mc_addr_hdr %08X\n",mc_addr_hdr);
// First check if multicast [1st octet is FF]
if ((mc_addr_hdr & 0xFF000000) == 0xFF000000) {
// packet type according to the scope of the multicast packet
// we don't consider RPT bits in second octet [maybe done later if needed]
switch(mc_addr_hdr & 0x000F0000) {
case (0x00020000):
*paddr_type = OAI_NW_DRV_IPV6_ADDR_TYPE_MC_SIGNALLING;
#ifdef OAI_DRV_DEBUG_CLASS
printk("nasrg_CLASS_cx6: multicast packet - signalling \n");
#endif
break;
case (0x000E0000):
*paddr_type = OAI_NW_DRV_IPV6_ADDR_TYPE_MC_MBMS;
//*pmbms_ix = 0;
//cx=gpriv->cx; // MBMS associate to Mobile 0
#ifdef OAI_DRV_DEBUG_CLASS
printk("nasrg_CLASS_cx6: multicast packet - MBMS data \n");
#endif
break;
default:
printk("nasrg_CLASS_cx6: default \n");
*paddr_type = OAI_NW_DRV_IPV6_ADDR_TYPE_UNKNOWN;
//*pmbms_ix = NASRG_MBMS_SVCES_MAX;
}
if (IN6_IS_ADDR_MULTICAST(&ipv6_hdr(skb)->daddr.in6_u.u6_addr32[0])) {
traffic_type = OAI_NW_DRV_IPV6_ADDR_TYPE_MULTICAST;
} else {
*paddr_type = OAI_NW_DRV_IPV6_ADDR_TYPE_UNICAST;
for (cxi=*cx_searcher; cxi<OAI_NW_DRV_CX_MAX; cxi++) {
(*cx_searcher)++;
sclassifier = gpriv->cx[cxi].sclassifier[dscp];
while (sclassifier!=NULL) {
if ((sclassifier->ip_version == OAI_NW_DRV_IP_VERSION_6) || (sclassifier->ip_version == OAI_NW_DRV_IP_VERSION_ALL)) { // verify that this is an IPv6 rule
/*LGif (IN6_IS_ADDR_UNSPECIFIED(&(sclassifier->daddr.ipv6))) {
printk("oai_nw_drv_find_cx6: addr is null \n");
sclassifier = sclassifier->next;
continue;
}*/
#ifdef OAI_DRV_DEBUG_CLASS
printk("cx %d : DSCP %d %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, dscp, NIP6ADDR(&(sclassifier->daddr.ipv6)));
#endif //OAI_DRV_DEBUG_CLASS
//if ((dst = (unsigned int*)&(((struct rt6_info *)skbdst)->rt6i_gateway)) == 0){
// LG: STRANGE
if (IN6_IS_ADDR_UNSPECIFIED(&ipv6_hdr(skb)->daddr)) {
printk("oai_nw_drv_find_cx6: dst addr is null \n");
sclassifier = sclassifier->next;
continue;
}
oai_nw_drv_create_mask_ipv6_addr(&masked_addr, sclassifier->dplen);
if (IN6_ARE_ADDR_MASKED_EQUAL(&ipv6_hdr(skb)->daddr, &(sclassifier->daddr.ipv6), &masked_addr)) {
#ifdef OAI_DRV_DEBUG_CLASS
printk("oai_nw_drv_find_cx6: found cx %d: %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, NIP6ADDR(&(sclassifier->daddr.ipv6)));
#endif //OAI_DRV_DEBUG_CLASS
return &gpriv->cx[cxi];
}
}
// Go to next classifier entry for connection
sclassifier = sclassifier->next;
}
}
traffic_type = OAI_NW_DRV_IPV6_ADDR_TYPE_UNICAST;
}
break;
case ETH_P_IP:
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_UNKNOWN;
#ifdef KERNEL_VERSION_GREATER_THAN_2622
//print_TOOL_pk_ipv4((struct iphdr *)skb->network_header);
if (IN_MULTICAST(htonl(ip_hdr(skb)->daddr))) {
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST;
} else {
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_UNICAST;
}
// TO DO BROADCAST
#else
//print_TOOL_pk_ipv4(skb->nh.iph);
if (IN_MULTICAST(htonl(ip_hdr(skb)->daddr))) {
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_MULTICAST;
} else {
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_UNICAST;
}
// TO DO BROADCAST
#endif
break;
case ETH_P_ARP:
traffic_type = OAI_NW_DRV_IPV4_ADDR_TYPE_BROADCAST;
break;
default:;
}
}
printk("oai_nw_drv_find_cx6 NOT FOUND: %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&ipv6_hdr(skb)->daddr));
return cx;
return traffic_type;
}
......@@ -68,8 +68,8 @@
ntohs((addr)->s6_addr16[7])
//#define OAI_DRV_DEBUG_SEND
//#define OAI_DRV_DEBUG_RECEIVE
#define OAI_DRV_DEBUG_SEND
#define OAI_DRV_DEBUG_RECEIVE
void oai_nw_drv_common_class_wireless2ip(u16 dlen,
void *pdcp_sdu,
int inst,
......@@ -329,7 +329,7 @@ void oai_nw_drv_common_ip2wireless_drop(struct sk_buff *skb, int inst){
// Request the transfer of data (QoS SAP)
void oai_nw_drv_common_ip2wireless(struct sk_buff *skb, int inst){
//---------------------------------------------------------------------------
struct pdcp_data_req_header_t pdcph;
struct pdcp_data_req_header_s pdcph;
struct oai_nw_drv_priv *priv=netdev_priv(oai_nw_drv_dev[inst]);
#ifdef LOOPBACK_TEST
int i;
......@@ -350,9 +350,11 @@ void oai_nw_drv_common_ip2wireless(struct sk_buff *skb, int inst){
return;
}
pdcph.data_size = skb->len;
pdcph.rb_id = skb->mark;
pdcph.inst = inst;
pdcph.data_size = skb->len;
pdcph.rb_id = skb->mark;
pdcph.inst = inst;
pdcph.traffic_type = oai_nw_drv_find_traffic_type(skb);
bytes_wrote = oai_nw_drv_netlink_send((char *)&pdcph,OAI_NW_DRV_PDCPH_SIZE);
#ifdef OAI_DRV_DEBUG_SEND
......@@ -386,7 +388,7 @@ void oai_nw_drv_common_ip2wireless(struct sk_buff *skb, int inst){
return;
}
#ifdef OAI_DRV_DEBUG_SEND
printk("[OAI_IP_DRV][%s] Sending packet of size %d to PDCP \n",__FUNCTION__,skb->len);
printk("[OAI_IP_DRV][%s] Sending packet of size %d to PDCP traffic type %d\n",__FUNCTION__,skb->len, pdcph.traffic_type);
for (j=0;j<skb->len;j++)
printk("%2x ",((unsigned char *)(skb->data))[j]);
......@@ -405,7 +407,7 @@ void oai_nw_drv_common_ip2wireless(struct sk_buff *skb, int inst){
void oai_nw_drv_common_wireless2ip(struct nlmsghdr *nlh) {
//---------------------------------------------------------------------------
struct pdcp_data_ind_header_t *pdcph = (struct pdcp_data_ind_header_t *)NLMSG_DATA(nlh);
struct pdcp_data_ind_header_s *pdcph = (struct pdcp_data_ind_header_s *)NLMSG_DATA(nlh);
struct oai_nw_drv_priv *priv;
priv = netdev_priv(oai_nw_drv_dev[pdcph->inst]);
......
......@@ -36,8 +36,8 @@
//Debug flags
//#define OAI_NW_DRV_DEBUG_DC
//#define OAI_NW_DRV_DEBUG_SEND
//#define OAI_NW_DRV_DEBUG_RECEIVE
#define OAI_NW_DRV_DEBUG_SEND
#define OAI_NW_DRV_DEBUG_RECEIVE
//#define OAI_NW_DRV_DEBUG_CLASS
//#define OAI_NW_DRV_DEBUG_GC
//#define OAI_NW_DRV_DEBUG_DC_MEASURE
......@@ -102,7 +102,7 @@