/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

#ifndef _NAS_CST
#define _NAS_CST

#define MAX_MEASURE_NB 5
#define NAS_MAX_LENGTH 180

//Debug flags
//#define NAS_DEBUG_DC
//#define NAS_DEBUG_SEND
//#define NAS_DEBUG_RECEIVE
//#define NAS_DEBUG_CLASS
//#define NAS_DEBUG_GC
//#define NAS_DEBUG_DC_MEASURE
//#define NAS_DEBUG_TIMER
//#define NAS_DEBUG_DEVICE
//#define NAS_DEBUG_INTERRUPT
//#define NAS_DEBUG_TOOL

// Other flags
#define DEMO_3GSM

// General Constants
#define NAS_MTU 1500
#define NAS_TX_QUEUE_LEN 100
#define NAS_ADDR_LEN 8
#define NAS_INET6_ADDRSTRLEN 46
#define NAS_INET_ADDRSTRLEN 16

#define NAS_CX_MAX 32 //128   //Identical to RRC constant: no you cannot
/* increase to 128  without risking stack problems: KEEP ATTENTION TO COMPILATION WARNINGS */
//#define NAS_CX_MULTICAST_ALLNODE 2

#define NAS_RETRY_LIMIT_DEFAULT 5

#define NAS_MESSAGE_MAXLEN 5004

#define NAS_SIG_SRB3 3
#define NAS_SIG_SRB4 3 // not used yet

//peer-to-peer messages between NAS entities
#define NAS_CMD_OPEN_RB 1

//#define NAS_IID1_CONTROL 0x0
//#define NAS_IID2_CONTROL __constant_htonl(0xffffffff)

//#define NAS_STATE_IDLE      0
//#define NAS_STATE_CONNECTED     1
//#define NAS_STATE_ESTABLISHMENT_REQUEST 2
//#define NAS_STATE_ESTABLISHMENT_FAILURE 3
//#define NAS_STATE_RELEASE_FAILURE   4
#define NAS_CX_RELEASE_UNDEF_CAUSE 1

// MT+RG NAS States
#define NAS_IDLE                  0x01
// Connection
#define NAS_CX_FACH               0x06
#define NAS_CX_DCH                0x0A
#define NAS_CX_RECEIVED           0x10
#define NAS_CX_CONNECTING         0x04
#define NAS_CX_RELEASING          0x08
#define NAS_CX_CONNECTING_FAILURE 0x14
#define NAS_CX_RELEASING_FAILURE  0x18
// Radio Bearers
#define NAS_RB_ESTABLISHING       0x24
#define NAS_RB_RELEASING          0x28
#define NAS_RB_DCH                0x2A


#define NAS_TIMER_ESTABLISHMENT_DEFAULT 12
#define NAS_TIMER_RELEASE_DEFAULT       2
#define NAS_TIMER_IDLE                  UINT_MAX
#define NAS_TIMER_TICK                  HZ

#define NAS_PDCPH_SIZE                  sizeof(struct pdcp_data_req_header_s)
#define NAS_IPV4_SIZE                   20
#define NAS_IPV6_SIZE                   40

#define NAS_DIRECTION_SEND      0
#define NAS_DIRECTION_RECEIVE   1
#define NAS_DIRECTION_FORWARD   2

// function number
#define NAS_FCT_DEL_SEND        1
#define NAS_FCT_QOS_SEND        2
#define NAS_FCT_DC_SEND         3
#define NAS_FCT_CTL_SEND        4

// type of IOCTL command
#define NAS_IOCTL_RRM 0x89F0

// Error cause
#define NAS_ERROR_ALREADYEXIST          1
#define NAS_ERROR_NOMEMORY    3
#define NAS_ERROR_NOTMT     9
#define NAS_ERROR_NOTRG     10
#define NAS_ERROR_NOTIDLE     11
#define NAS_ERROR_NOTCONNECTED    12
#define NAS_ERROR_NORB            14
#define NAS_ERROR_NOTCORRECTVALUE 32
#define NAS_ERROR_NOTCORRECTLCR         33
#define NAS_ERROR_NOTCORRECTDIR         34
#define NAS_ERROR_NOTCORRECTDSCP  35
#define NAS_ERROR_NOTCORRECTVERSION 36
#define NAS_ERROR_NOTCORRECTRABI  37


/**********************************************************/
/* Constants related with IP protocols                    */
/**********************************************************/

//#define NAS_PORT_CONTROL __constant_htons(0xc45)
//#define NAS_PORT_AUTHENTICATION __constant_htons(1811)

#define NAS_TRAFFICCLASS_MASK __constant_htonl(0x0fc00000)

// Network control codepoint 111000 + IP version 6
#define NAS_FLOWINFO_NCONTROL __constant_htonl(0x6e000000)
// network control codepoint 111000
#define NAS_DSCP_NCONTROL 56   //0x38
// default codepoint 1000000
#define NAS_DSCP_DEFAULT 64
#define NAS_DSCP_MAX 193

#define NAS_PROTOCOL_DEFAULT 0
#define NAS_PROTOCOL_TCP IPPROTO_TCP
#define NAS_PROTOCOL_UDP IPPROTO_UDP
#define NAS_PROTOCOL_ICMP4 IPPROTO_ICMP
#define NAS_PROTOCOL_ICMP6 IPPROTO_ICMPV6

#define NAS_PORT_DEFAULT  __constant_htons(65535)
#define NAS_PORT_HTTP   __constant_htons(80)

#define NAS_VERSION_DEFAULT   0
#define NAS_VERSION_4   4
#define NAS_VERSION_6   0 //?MW

#define NAS_DEFAULT_IPV4_ADDR 0
#define NAS_DEFAULT_IPV6_ADDR0 0
#define NAS_DEFAULT_IPV6_ADDR1 0
#define NAS_DEFAULT_IPV6_ADDR2 0
#define NAS_DEFAULT_IPV6_ADDR3 0


#define NAS_MPLS_VERSION_CODE 99

#define NB_INSTANCES_MAX 64 //16


#endif



